{text-align:justify; margin-left:10%}

Oil Refinery Production Example Model ... Problem-Solving



Oil Refinery Production Model for Business Strategies

Problem Description: An oil company may have many different distillation processes going on at each of its refineries. Each time new crude oil arrives at a refinery, or one distillation unit goes in or out of service, a new tweaking of all distillation parameters must be done in order to maximize / minimize the company’s objective.

On this page I'll will attempt to guide you through the various model routines in order to create a 'picture' for you to understand what's going on.

1. State number of plants / refineries and the number of products. To start, nRefineries = 1 until all Refineries are up and running this Production model. When all Refineries have this working, then increase nRefineries = 2 then 3 and so on.


  nRefineries = 22:  nProducts = 33

2. Execute ALL departments involved in this model. Start with a minimum departments and increase departments as you build this model and are confident things are working as planned. Processing model is the only one necessary to get things rolling.


model departments
  call processing		! distillation model for 'i'th Refinery
  call inventory		! present supply of various products
  call demand			! estimated demands
  call distribution		! shipping costs
  call maintenance		! repairs, continual maintenance, etc.
  call accountants		! fixed asset costs, etc.
! call ??? 				! other departments as developed
End

3. The Processing model states how the crude oil is broken down into the sellable oil units; e.g., 10, 20, 30, 90 grades. Think distribution! Where are the different grades to be sold? Heavy grades in the cold parts and light grades in the hot parts of the country. So, in order to help minimize cost produce the oil products in their appropriate regions.


model Processing	! jth distillation unit @ refinery
! assume distillation requires solving a PDE or two.  So below is the bases for solving a PDE.
  t = 0:  tPrt = tPrint
  do k = 1, nDistUnits( j)
    kDistModel = ???
    Initiate ISIS  for PDEquations   ooo
    do while (t .lt. tFinal)
      Integrate PDEquations    by ISIS
      if( t .ge. tPrt) print 79, t, (U(ii),ii = 1,ip)
      tPrt = tPrt + tPrint
    end do
  end do
  crudeErr = crudeErr+(totCrudeIn(j)– crudeUsed)**2
  79  format( 1x,f8.4,20(g14.5, 1x))
end

model PDEquations
  if( kDistModel .eq. 1) then
    pde_1 = pde equations with parameters 
  ! assume # 3, 7, & 8 products are created
    qtyProd(3) = qtyProd(3) + ???
    qtyProd(7) = qtyProd(7) + ???
    qtyProd(8) = qtyProd(8) + ???
  elseif( kDistModel .eq. 2) then
    pde_2 = pde equations with parameters 
  ! assume # 2 & 8 products are created
    qtyProd(2) = qtyProd(2) + ???
    qtyProd(8) = qtyProd(8) + ???
    
    ooo
    
  elseif( kDistModel .eq. k) then
    pde_k = pde equations with parameters 
  ! assume # 1, 2, & 8 products are created
    qtyProd(1) = qtyProd(1) + ???
    qtyProd(2) = qtyProd(2 )+ ???
    qtyProd(8) = qtyProd(8 )+ ???
  end if
  crudeUsed = crudeUsed + ???
  pollution = pollution + ???
  cost = cost + mfgCost + distCost + ???
  profit = profit + ??? - cost
end

4. The distribution department should model all routes used to deliver your oil products. Assuming pollution and costs are key (dependent) parameters,key track of all that affect them. The solver may find new routes that minimize / maximize things.


model distribution
  distPollution = 0:	distCosts = 0
! your (algebraic?) equations that model your distribution go here.

  ooo

  distPollution = distPollution + ???
  distCosts = distCosts + ???
End

Total model is summed up next. The solver will vary your (independent) variables, see 'totProdPrct' in model, in order to meet company's objectives.


global all
problem OilProduction
  nRefineries = 22:  nProducts = 33
  dynamic hi, low, totCrudeIn, ooo
  call setup    ! initial values
  call history  ! extrapolate 4 today’s usage
! find product percentages for all Refineries in order to maximize profit.
  find totProdPrct     in refineries     by jupiter
    matching errsum      to maximize profit
End
model refineries
  pollution = 0:  profit = 0:  cost = 0:  errSum = 0
  do i = 1, nProducts
    do j = 1, nRefineries
       sameProd(j) = totProdPrct(j, i) * totCrudeIn(i)
    end do
    crudeUsed = 0:  crudeErr = 0
  ! finds qty production @ each refinery to minimize overall pollution
  
  ! to restrict prod., e.g. 3rd qty, set hi(3) = low(3)
  
  find sameProd    in processing    by Jove
    with upper hi    and lower low
    matching crudeErr      to minimize pollution
  
    do j = 1, nRefineries
      errSum = errSum+ (sameProd(j) - totProdPrct(j,i) * totCrudeIn(i))**2
    end do
  end do
  ! find best routes to deliver products

  ooo

  find routes in distribution   ooo   to minimize distPollution
  profit = ???		! calculate / measure it!
  cost = ???		! ditto
  profit = profit - cost
end
model distribution
    distPollution = 0
  ! your (algebraic?) equations that model your distribution go here.

  ooo
end
model Processing	! jth distillation unit @ refinery
! assume distillation requires solving a PDE or two.  So below is the bases for solving a PDE.
  t = 0:  tPrt = tPrint
  do k = 1, nDistUnits( j)
    kDistModel = ???
    Initiate ISIS  for PDEquations   ooo
    do while (t .lt. tFinal)
      Integrate PDEquations    by ISIS
      if( t .ge. tPrt) print 79, t, (U(ii),ii = 1,ip)
      tPrt = tPrt + tPrint
    end do
  end do
  crudeErr = crudeErr+(totCrudeIn(j)– crudeUsed)**2
  79  format( 1x,f8.4,20(g14.5, 1x))
end
model PDEquations
  if( kDistModel .eq. 1) then
    pde_1 = pde equations with parameters 
  ! assume # 3, 7, & 8 products are created
    qtyProd(3) = qtyProd(3) + ???
    qtyProd(7) = qtyProd(7) + ???
    qtyProd(8) = qtyProd(8) + ???
  elseif( kDistModel .eq. 2) then
    pde_2 = pde equations with parameters 
  ! assume # 2 & 8 products are created
    qtyProd(2) = qtyProd(2) + ???
    qtyProd(8) = qtyProd(8) + ???
    
    ooo
    
  elseif( kDistModel .eq. k) then
    pde_k = pde equations with parameters 
  ! assume # 1, 2, & 8 products are created
    qtyProd(1) = qtyProd(1) + ???
    qtyProd(2) = qtyProd(2 )+ ???
    qtyProd(8) = qtyProd(8 )+ ???
  end if
  crudeUsed = crudeUsed + ???
  pollution = pollution + ???
  cost = cost + mfgCost + distCost + ???
  profit = profit + ???
end
procedure Setup
allot totProdPrct(nRefineries, nProducts), hi(nProducts), low(nProducts), ooo

! today’s available Crude Oil at different refineries
   = data( …’ available crude INPUT levels at each Refinery goes here’ …>
 = data( … storage limits for various products goes here …)
 = data( … target amounts less inventory goes here …)
 = data( … # of distillation units @ each refinery goes here …)
End
procedure history
! here, use past history to estimate today’s oil needs
  totQtyOut( 1,1)> = data( …’ amount of crude oil to be targeted for today at the 1st Refinery goes here’
  totQtyOut ( 2,1)> = data( …’ 2nd Refinery’ …)
    ooo
  totQtyOut (nRefineries,1)> = data( …’ nth Refinery’ …)
end

This example shows nesting of find statements that will help maximize productivity. Getting agreement on what a companies objective is or should be may take some time. It is hoped that this example will aide you on solving your problem with Calculus programming. Solve not just one equation but your entire problem/project in one program.

Communication:Have you seen movie Hidden Figures, if you haven’t seen it, you should. It may help understand the communication problem between different types of people; e.g. NASA’s Engineers, Scientists, and Mathematicians. The movie shows engineers trying to solve some equations and getting no where fast! A mathematician comes along and solves the problem. But numbers say little to engineers. Near the movie’s end, the mathematician draws a graph showing a solution. The engineers finally get the ‘picture’ of what the equations are trying to say to them. Remember, a picture is worth a 1,000 words, right?

Feedback Request: How many companies are interested in solving their similar problem? At present, this program may not work due to amount of storage necessary. In order to fix this storage problem, we need your values for ‘nRefineries’ & ‘nProducts’. The product of nRefineries * nProducts may be the problem. Assume each is 100 then their product is 104. Internal arrays (e.g. jacobian) is the square of this product, 108! Knowing that the majority of problems would work with 10n would provide a target value for future releases of Calculus compilers.

If interested in solving such production problems, please contact Optimal Designs Enterprise.

The next article will show a Buy, Sell, or Hold model. This model can be executed every day, month, or when a CEO wants to see their options. It can be very helpful, but practice is key to reading the output and understanding what it truly says.



< < Back

Next > >