{"title":"Design patterns and Fortran 2003","authors":"A. Markus","doi":"10.1145/1462614.1462615","DOIUrl":null,"url":null,"abstract":"interface ! ! Subroutine for storing the initial values ! subroutine initial( solver, initial_data ) type(ode_solver) :: solver real, dimension(:) :: initial_data end subroutine initial ! ! Function to compute the derivative ! function eval_deriv( x, t ) real, dimension(:) :: x real, dimension(size(x)) :: eval_deriv ! Derivative is array of ! same size as x real :: t end function eval_deriv ! ! Interface function to hide the internal workings ! function next(solver, time, time_step) type(ode_solver) :: solver real :: time real :: time_step real, dimension(size(ode_solver%state)) :: next_step end function next_step ! ! Function to actually compute the new values ! function solve_step(solver, time, time_step) type(ode_solver) :: solver real :: time real :: time_step real, dimension(size(ode_solver%state)) :: next_step 9 ACM Fortran Forum, December 2008, 27, 3 end function next_step end interface ! ! Declaration of the functions ! procedure(initial) :: initial_values procedure(next) :: next_step procedure(solve_step) :: solve_euler procedure(solve_step) :: solve_heun procedure(solve_step) :: solve_runge_kutta procedure(solve_step) :: ... ! ! Definition of the specific methods for ! solving the ODE ! type(ode_method), dimension(10) :: solvers = & (/ ode_method(solve_euler), ode_method(solve_heun), & ode_method(solve_runge_kutta), ... /)","PeriodicalId":379614,"journal":{"name":"ACM SIGPLAN Fortran Forum","volume":"23 1","pages":"0"},"PeriodicalIF":0.0000,"publicationDate":"2008-11-30","publicationTypes":"Journal Article","fieldsOfStudy":null,"isOpenAccess":false,"openAccessPdf":"","citationCount":"7","resultStr":null,"platform":"Semanticscholar","paperid":null,"PeriodicalName":"ACM SIGPLAN Fortran Forum","FirstCategoryId":"1085","ListUrlMain":"https://doi.org/10.1145/1462614.1462615","RegionNum":0,"RegionCategory":null,"ArticlePicture":[],"TitleCN":null,"AbstractTextCN":null,"PMCID":null,"EPubDate":"","PubModel":"","JCR":"","JCRName":"","Score":null,"Total":0}
引用次数: 7
Abstract
interface ! ! Subroutine for storing the initial values ! subroutine initial( solver, initial_data ) type(ode_solver) :: solver real, dimension(:) :: initial_data end subroutine initial ! ! Function to compute the derivative ! function eval_deriv( x, t ) real, dimension(:) :: x real, dimension(size(x)) :: eval_deriv ! Derivative is array of ! same size as x real :: t end function eval_deriv ! ! Interface function to hide the internal workings ! function next(solver, time, time_step) type(ode_solver) :: solver real :: time real :: time_step real, dimension(size(ode_solver%state)) :: next_step end function next_step ! ! Function to actually compute the new values ! function solve_step(solver, time, time_step) type(ode_solver) :: solver real :: time real :: time_step real, dimension(size(ode_solver%state)) :: next_step 9 ACM Fortran Forum, December 2008, 27, 3 end function next_step end interface ! ! Declaration of the functions ! procedure(initial) :: initial_values procedure(next) :: next_step procedure(solve_step) :: solve_euler procedure(solve_step) :: solve_heun procedure(solve_step) :: solve_runge_kutta procedure(solve_step) :: ... ! ! Definition of the specific methods for ! solving the ODE ! type(ode_method), dimension(10) :: solvers = & (/ ode_method(solve_euler), ode_method(solve_heun), & ode_method(solve_runge_kutta), ... /)