source("grind.R")
## grind.R (03-05-2024) was sourced
model <- function(t, state, parms) {
  with(as.list(c(state,parms)), {
    dR <- r*R*(1 - R/K) - a*R*N
    dN <- c*a*R*N - delta*N
    return(list(c(dR, dN)))  
  }) 
}  
p <- c(r=1,K=1,a=1,c=1,delta=0.5) 
s <- c(R=1,N=0.1)

library(shiny)

ui <- fluidPage(
  titlePanel("Lotka Volterra model"),
  sidebarLayout(
    sidebarPanel(
      sliderInput(inputId=names(s[1]),label=names(s[1]),min=0,max=10,step=0.01,value=as.numeric(s[1])),
      sliderInput(inputId=names(s[2]),label=names(s[2]),min=0,max=10,step=0.01,value=as.numeric(s[2])),
      sliderInput(inputId=names(p[1]),label=names(p[1]),min=0,max=p[1]*10,step=p[1]*0.01,value=p[1]),
      sliderInput(inputId=names(p[2]),label=names(p[2]),min=0,max=p[2]*10,step=p[2]*0.01,value=p[2]),
      sliderInput(inputId=names(p[3]),label=names(p[3]),min=0,max=p[3]*10,step=p[3]*0.01,value=p[3]),
      sliderInput(inputId=names(p[4]),label=names(p[4]),min=0,max=p[4]*10,step=p[4]*0.01,value=p[4]),
      sliderInput(inputId=names(p[5]),label=names(p[5]),min=0,max=p[5]*10,step=p[5]*0.01,value=p[5])
    ),

    mainPanel(
      h4("R '= r*R*(1 - R/K) - a*R*N"),
      h4("N '= c*a*R*N - delta*N"),
      plotOutput(outputId="grind"),
      radioButtons("radio", "Grind output:",c("Time plot"=0,"Nullclines"=1,"Trajectory"=2,"Portrait"=3,"Steady state"=4),selected=1,inline=TRUE),
      fluidRow(
      column(3,numericInput(inputId="tmax",label="Tmax",value=100)),
      column(3,numericInput(inputId="tstep",label="Tstep",value=0.1,step=0.1))),
      textOutput("log")
    )
  )
)

server <- function(input, output) {
  output$grind <- renderPlot({
    radiob <- input$radio
    for (i in names(s)) s[i] <- input[[i]]
    for (i in names(p)) p[i] <- input[[i]]
    tmax <- input$tmax
    tstep <- input$tstep
    xmax <- 1.05*max(p["K"],p["delta"]/(p["c"]*p["a"]),s["R"])
    ymax <- 1.05*max(p["r"]/p["a"],s["N"])
    output$log <- renderText("")
    if (radiob == 0) {
      f <- run(tmax=tmax,tstep=0.1,odes=model,state=s,parms=p)
      output$log <- renderText({paste("Ended in R =",round(f[1],5),"N =",round(f[2],5),sep=" ")})
    }
    else if (radiob <= 2) {
      plane(xmax=xmax,ymax=ymax,odes=model,state=s,parms=p)
      if (radiob == 2) {
        f <- run(tmax=tmax,tstep=tstep,odes=model,state=s,parms=p,traject=TRUE)
        output$log <- renderText({paste("Ended in R =",round(f[1],5),"N =",round(f[2],5),sep=" ")})
      }
    }
    else if (radiob == 3) plane(xmax=xmax,ymax=ymax,tmax=tmax,tstep=tstep,odes=model,state=s,parms=p,portrait=TRUE)
    else {
      plane(xmax=xmax,ymax=ymax,odes=model,state=s,parms=p)
      f <- newton(state=s,parms=p,odes=model,plot=TRUE,positive=TRUE)
      if (is.null(f)) output$log <- renderText({"No convergence: start closer to a steady state"})
      else output$log <- renderText({paste("Converged into R =",round(f[1],5),"N =",round(f[2],5),sep=" ")})
    }
  })
}

shinyApp(ui = ui, server = server)