read_parameters_solver_settings_nonlinear Subroutine

subroutine read_parameters_solver_settings_nonlinear(self, json)

If the method is modified newton then read the additional parameters

Arguments

Type IntentOptional Attributes Name
class(type_input) :: self
type(json_file), intent(inout) :: json

Calls

proc~~read_parameters_solver_settings_nonlinear~~CallsGraph proc~read_parameters_solver_settings_nonlinear read_parameters_solver_settings_nonlinear destroy destroy proc~read_parameters_solver_settings_nonlinear->destroy get get proc~read_parameters_solver_settings_nonlinear->get log_warning log_warning proc~read_parameters_solver_settings_nonlinear->log_warning print_error_message print_error_message proc~read_parameters_solver_settings_nonlinear->print_error_message proc~error_message error_message proc~read_parameters_solver_settings_nonlinear->proc~error_message proc~join join proc~read_parameters_solver_settings_nonlinear->proc~join proc~read_parameters_solver_settings_nonlinear_convergence read_parameters_solver_settings_nonlinear_convergence proc~read_parameters_solver_settings_nonlinear->proc~read_parameters_solver_settings_nonlinear_convergence log_error log_error proc~error_message->log_error proc~read_parameters_solver_settings_nonlinear_convergence->destroy proc~read_parameters_solver_settings_nonlinear_convergence->get proc~read_parameters_solver_settings_nonlinear_convergence->log_warning proc~read_parameters_solver_settings_nonlinear_convergence->print_error_message proc~read_parameters_solver_settings_nonlinear_convergence->proc~error_message proc~read_parameters_solver_settings_nonlinear_convergence->proc~join

Called by

proc~~read_parameters_solver_settings_nonlinear~~CalledByGraph proc~read_parameters_solver_settings_nonlinear read_parameters_solver_settings_nonlinear proc~read_parameters_solver_settings read_parameters_solver_settings proc~read_parameters_solver_settings->proc~read_parameters_solver_settings_nonlinear proc~inout_read_basic_parameters inout_read_basic_parameters proc~inout_read_basic_parameters->proc~read_parameters_solver_settings interface~inout_read_basic_parameters type_input%inout_read_basic_parameters interface~inout_read_basic_parameters->proc~inout_read_basic_parameters proc~initialize_type_input type_input%initialize_type_input proc~initialize_type_input->interface~inout_read_basic_parameters

Source Code

    subroutine read_parameters_solver_settings_nonlinear(self, json)
        implicit none
        class(type_input) :: self
        type(json_file), intent(inout) :: json

        logical :: found
        character(:), allocatable :: key
        character(:), allocatable :: key_base

        key = join([solver_settings, nonlinear_solver, method])
        call json%get(key, self%basic%solver_settings%nonlinear_solver%method, found)
        call json%print_error_message(output_unit)
        if (.not. found) then
            call global_logger%log_warning(message="Default nonlinear solver method is set to 'none'.")
            self%basic%solver_settings%nonlinear_solver%method = "none"
        else if (.not. any(valid_nonlinear_solver_methods(:) == self%basic%solver_settings%nonlinear_solver%method)) then
            call json%destroy()
            call error_message(905, c_opt=key)
        end if

        !! If the method is modified newton then read the additional parameters
        select case (self%basic%solver_settings%nonlinear_solver%method)
        case (valid_nonlinear_solver_methods(3))
            key = join([solver_settings, nonlinear_solver, update_frequency])
            call json%get(key, self%basic%solver_settings%nonlinear_solver%update_frequency, found)
            call json%print_error_message(output_unit)
            if (.not. found) then
                call global_logger%log_warning(message="Using default update frequency of 5 for modified Newton method.")
                self%basic%solver_settings%nonlinear_solver%update_frequency = 5
            end if
        end select

        select case (self%basic%solver_settings%nonlinear_solver%method)
        case (valid_nonlinear_solver_methods(2), valid_nonlinear_solver_methods(3))
            key = join([solver_settings, nonlinear_solver, max_iterations])
            call json%get(key, self%basic%solver_settings%nonlinear_solver%max_iterations, found)
            call json%print_error_message(output_unit)
            if (.not. found) then
                call global_logger%log_warning(message="Using default maximum iterations of 1000 for nonlinear solver.")
                self%basic%solver_settings%nonlinear_solver%max_iterations = 1000
            else if (self%basic%solver_settings%nonlinear_solver%max_iterations <= 0) then
                call json%destroy()
                call error_message(905, c_opt=key)
            end if

            key = join([solver_settings, nonlinear_solver, convergence, use_criteria])
            call json%get(key, self%basic%solver_settings%nonlinear_solver%convergence%use_criteria, found)
            call json%print_error_message(output_unit)
            if (.not. found) then
                call json%destroy()
                call error_message(904, c_opt=key)
            else if (.not. any(valid_criteria_types(:) == &
                               self%basic%solver_settings%nonlinear_solver%convergence%use_criteria)) then
                call json%destroy()
                call error_message(905, c_opt=key)
            end if

            select case (self%basic%solver_settings%nonlinear_solver%convergence%use_criteria)
            case (valid_criteria_types(3)) ! absolute
                key = join([solver_settings, nonlinear_solver, convergence, logic_between_criteria])
                call json%get(key, self%basic%solver_settings%nonlinear_solver%convergence%use_logic, found)
                call json%print_error_message(output_unit)
                if (.not. found) then
                    call json%destroy()
                    call error_message(904, c_opt=key)
                else if (.not. any(valid_logic_types(:) == self%basic%solver_settings%nonlinear_solver%convergence%use_logic)) then
                    call json%destroy()
                    call error_message(905, c_opt=key)
                end if
            end select

            select case (self%basic%solver_settings%nonlinear_solver%convergence%use_criteria)
            case (valid_criteria_types(1)) ! residual
                key_base = join([solver_settings, nonlinear_solver, convergence, residual])
                call read_parameters_solver_settings_nonlinear_convergence( &
                    self%basic%solver_settings%nonlinear_solver%convergence%residual, json, key_base)
            case (valid_criteria_types(2)) ! update
                key_base = join([solver_settings, nonlinear_solver, convergence, update])
                call read_parameters_solver_settings_nonlinear_convergence( &
                    self%basic%solver_settings%nonlinear_solver%convergence%update, json, key_base)
            case (valid_criteria_types(3)) ! residual and update
                key_base = join([solver_settings, nonlinear_solver, convergence, residual])
                call read_parameters_solver_settings_nonlinear_convergence( &
                    self%basic%solver_settings%nonlinear_solver%convergence%residual, json, key_base)
                key_base = join([solver_settings, nonlinear_solver, convergence, update])
                call read_parameters_solver_settings_nonlinear_convergence( &
                    self%basic%solver_settings%nonlinear_solver%convergence%update, json, key_base)
            end select
        end select

    end subroutine read_parameters_solver_settings_nonlinear