LCOV - code coverage report
Current view: top level - num/test/src - bari_chemakzo.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 106 0
Test Date: 2025-05-08 18:23:42 Functions: 0.0 % 6 0

            Line data    Source code
       1              : !-----------------------------------------------------------------------
       2              : !
       3              : !     This file is part of the Test Set for IVP solvers
       4              : !     http://www.dm.uniba.it/~testset/
       5              : !
       6              : !        Chemical Akzo Nobel problem
       7              : !        ODE of dimension 6
       8              : !
       9              : !     DISCLAIMER: see
      10              : !     http://www.dm.uniba.it/~testset/disclaimer.php
      11              : !
      12              : !     The most recent version of this source file can be found at
      13              : !     http://www.dm.uniba.it/~testset/src/problems/chemakzo.f
      14              : !
      15              : !     This is revision
      16              : !     $Id: chemakzo.F,v 1.2 2006/10/02 10:29:14 testset Exp $
      17              : !
      18              : !-----------------------------------------------------------------------
      19              : module bari_chemakzo
      20              : 
      21              :    implicit none
      22              : 
      23              : contains
      24              : 
      25            0 :    subroutine chemakzo_prob(fullnm, problm, type, neqn, ndisc, t, numjac, mljac, mujac, nummas, mlmas, mumas, ind)
      26              :       character(len=*) :: fullnm, problm, type
      27              :       integer :: neqn, ndisc, mljac, mujac, mlmas, mumas, ind(*)
      28              :       double precision :: t(0:*)
      29              :       logical :: numjac, nummas
      30              : 
      31              :       integer :: i
      32              : 
      33            0 :       fullnm = 'Chemical Akzo Nobel problem'
      34            0 :       problm = 'chemakzo'
      35            0 :       type = 'DAE'
      36            0 :       neqn = 6
      37            0 :       ndisc = 0
      38            0 :       t(0) = 0d0
      39            0 :       t(1) = 180d0
      40            0 :       numjac = .false.
      41            0 :       mljac = neqn
      42            0 :       mujac = neqn
      43            0 :       mlmas = 0
      44            0 :       mumas = 0
      45            0 :       do i = 1, neqn
      46            0 :          ind(i) = 0
      47              :       end do
      48              : 
      49            0 :    end subroutine chemakzo_prob
      50              : !-----------------------------------------------------------------------
      51            0 :    subroutine chemakzo_init(neqn, y, yprime, consis)
      52              :       integer :: neqn
      53              :       double precision :: y(neqn), yprime(neqn)
      54              :       logical :: consis
      55              : 
      56              :       integer :: ierr, ipar(0)
      57              :       double precision :: rpar(0)
      58              : 
      59              :       double precision :: ks
      60              :       parameter(ks=115.83d0)
      61              : 
      62            0 :       y(1) = 0.444d0
      63            0 :       y(2) = 0.00123d0
      64            0 :       y(3) = 0d0
      65            0 :       y(4) = 0.007d0
      66            0 :       y(5) = 0d0
      67            0 :       y(6) = ks*y(1)*y(4)
      68              : 
      69            0 :       consis = .true.
      70              : 
      71            0 :       call chemakzo_feval(neqn, 0d0, y, y, yprime, ierr, rpar, ipar)
      72              : 
      73            0 :    end subroutine chemakzo_init
      74              : !-----------------------------------------------------------------------
      75            0 :    subroutine chemakzo_feval(neqn, t, y, yprime, f, ierr, rpar, ipar)
      76              :       integer :: neqn, ierr, ipar(*)
      77              :       double precision :: t, y(neqn), yprime(neqn), f(neqn), rpar(*)
      78              : 
      79              :       double precision :: k1, k2, k3, k4, kbig, kla, po2, hen, ks
      80              :       parameter(k1=18.7d0, k2=0.58d0, k3=0.09d0, k4=0.42d0, kbig=34.4d0, kla=3.3d0, ks=115.83d0, po2=0.9d0, hen=737d0)
      81            0 :       double precision :: r1, r2, r3, r4, r5, fin, sqy2
      82              :       include 'formats'
      83              : 
      84            0 :       if (y(2) < 0d0) then
      85              :          !write(*,*) 'y(2)', y(2)
      86            0 :          ierr = -1
      87            0 :          return
      88              :       end if
      89              : 
      90            0 :       sqy2 = sqrt(y(2))
      91            0 :       r1 = k1*y(1)*y(1)*y(1)*y(1)*sqy2
      92            0 :       r2 = k2*y(3)*y(4)
      93            0 :       r3 = k2/kbig*y(1)*y(5)
      94            0 :       r4 = k3*y(1)*y(4)*y(4)
      95            0 :       r5 = k4*(y(6)**2)*sqy2
      96            0 :       fin = kla*(po2/hen - y(2))
      97              : 
      98            0 :       f(1) = ((-2d0*r1 + r2) - r3) - r4
      99            0 :       f(2) = ((-0.5d0*r1 - r4) - 0.5d0*r5) + fin
     100            0 :       f(3) = (r1 - r2) + r3
     101            0 :       f(4) = (-r2 + r3) - 2d0*r4
     102            0 :       f(5) = (r2 - r3) + r5
     103            0 :       f(6) = ks*y(1)*y(4) - y(6)
     104              : 
     105              :    end subroutine chemakzo_feval
     106              : !-----------------------------------------------------------------------
     107            0 :    subroutine chemakzo_jeval(ldim, neqn, t, y, yprime, dfdy, ierr, rpar, ipar)
     108              :       integer :: ldim, neqn, ierr, ipar(*)
     109              :       double precision :: t, y(neqn), yprime(neqn), dfdy(ldim, neqn), rpar(*)
     110              : 
     111              :       double precision :: k1, k2, k3, k4, kbig, kla, ks
     112              :       parameter(k1=18.7d0, k2=0.58d0, k3=0.09d0, k4=0.42d0, kbig=34.4d0, kla=3.3d0, ks=115.83d0)
     113              :       integer :: i, j
     114            0 :       double precision :: r11, r12, r23, r24, r31, r35, r41, r44, r52, r56, fin2
     115            0 :       double precision :: y13
     116              : 
     117            0 :       if (y(2) < 0d0) then
     118            0 :          ierr = -1
     119            0 :          return
     120              :       end if
     121              : 
     122            0 :       do j = 1, neqn
     123            0 :          do i = 1, neqn
     124            0 :             dfdy(i, j) = 0d0
     125              :          end do
     126              :       end do
     127              : 
     128            0 :       y13 = y(1)*y(1)*y(1)
     129            0 :       r11 = 4d0*k1*y13*sqrt(y(2))
     130            0 :       r12 = 0.5d0*k1*y(1)*y13/sqrt(y(2))
     131            0 :       r23 = k2*y(4)
     132            0 :       r24 = k2*y(3)
     133            0 :       r31 = (k2/kbig)*y(5)
     134            0 :       r35 = (k2/kbig)*y(1)
     135            0 :       r41 = k3*y(4)**2
     136            0 :       r44 = 2d0*k3*y(1)*y(4)
     137            0 :       r52 = 0.5d0*k4*(y(6)**2)/sqrt(y(2))
     138            0 :       r56 = 2d0*k4*y(6)*sqrt(y(2))
     139            0 :       fin2 = -kla
     140              : 
     141            0 :       dfdy(1, 1) = (-2d0*r11 - r31) - r41
     142            0 :       dfdy(1, 2) = -2d0*r12
     143            0 :       dfdy(1, 3) = r23
     144            0 :       dfdy(1, 4) = r24 - r44
     145            0 :       dfdy(1, 5) = -r35
     146            0 :       dfdy(2, 1) = -0.5d0*r11 - r41
     147            0 :       dfdy(2, 2) = -0.5d0*r12 - 0.5d0*r52 + fin2
     148            0 :       dfdy(2, 4) = -r44
     149            0 :       dfdy(2, 6) = -0.5d0*r56
     150            0 :       dfdy(3, 1) = r11 + r31
     151            0 :       dfdy(3, 2) = r12
     152            0 :       dfdy(3, 3) = -r23
     153            0 :       dfdy(3, 4) = -r24
     154            0 :       dfdy(3, 5) = r35
     155            0 :       dfdy(4, 1) = r31 - 2d0*r41
     156            0 :       dfdy(4, 3) = -r23
     157            0 :       dfdy(4, 4) = -r24 - 2d0*r44
     158            0 :       dfdy(4, 5) = r35
     159            0 :       dfdy(5, 1) = -r31
     160            0 :       dfdy(5, 2) = r52
     161            0 :       dfdy(5, 3) = r23
     162            0 :       dfdy(5, 4) = r24
     163            0 :       dfdy(5, 5) = -r35
     164            0 :       dfdy(5, 6) = r56
     165            0 :       dfdy(6, 1) = ks*y(4)
     166            0 :       dfdy(6, 4) = ks*y(1)
     167            0 :       dfdy(6, 6) = -1d0
     168              : 
     169              :    end subroutine chemakzo_jeval
     170              : !-----------------------------------------------------------------------
     171            0 :    subroutine chemakzo_meval(ldim, neqn, t, yprime, dfddy, ierr, rpar, ipar)
     172              :       integer :: ldim, neqn, ierr, ipar(*)
     173              :       double precision :: t, yprime(neqn), dfddy(ldim, neqn), rpar(*)
     174              : 
     175              :       integer :: i
     176            0 :       ierr = 0
     177              : 
     178            0 :       do i = 1, neqn - 1
     179            0 :          dfddy(1, i) = 1d0
     180              :       end do
     181              : 
     182            0 :       dfddy(1, neqn) = 0d0
     183              : 
     184            0 :    end subroutine chemakzo_meval
     185              : !-----------------------------------------------------------------------
     186            0 :    subroutine chemakzo_solut(neqn, t, y)
     187              :       integer :: neqn
     188              :       double precision :: t, y(neqn)
     189              : 
     190              : ! computed using true double precision on a Cray C90
     191              : 
     192              : ! Solving Chemical Akzo Nobel problem using PSIDE
     193              : 
     194              : ! User input:
     195              : 
     196              : ! give relative error tolerance: 1d-19
     197              : ! give absolute error tolerance: 1d-19
     198              : 
     199              : ! Integration characteristics:
     200              : 
     201              : !    number of integration steps        5535
     202              : !    number of accepted steps           5534
     203              : !    number of f evaluations          100411
     204              : !    number of Jacobian evaluations        7
     205              : !    number of LU decompositions         368
     206              : 
     207              : ! CPU-time used:                          30.77 sec
     208              : !
     209              : 
     210            0 :       y(1) = 0.1150794920661702d0
     211            0 :       y(2) = 0.1203831471567715d-2
     212            0 :       y(3) = 0.1611562887407974d0
     213            0 :       y(4) = 0.3656156421249283d-3
     214            0 :       y(5) = 0.1708010885264404d-1
     215            0 :       y(6) = 0.4873531310307455d-2
     216              : 
     217            0 :    end subroutine chemakzo_solut
     218              : 
     219              : end module bari_chemakzo
        

Generated by: LCOV version 2.0-1