If the method is modified newton then read the additional parameters
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(type_input) | :: | self | ||||
type(json_file), | intent(inout) | :: | json |
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