LCOV - code coverage report
Current view: top level - auto_diff/test/src - test_auto_diff.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 819 819
Test Date: 2025-06-06 17:08:43 Functions: 100.0 % 9 9

            Line data    Source code
       1            1 : program test_auto_diff
       2              : 
       3            1 :    use math_lib
       4              :    use auto_diff
       5              :    use const_def, only: dp, ln10, pi
       6              : 
       7              :    implicit none
       8              : 
       9            1 :    call do_test_auto_diff_1var_order1()
      10            1 :    call do_test_auto_diff_2var_order1()
      11            1 :    call do_test_auto_diff_star_order1()
      12              : 
      13              : contains
      14              : 
      15            9 :    subroutine header(text)
      16              :       character(len=*), intent(in) :: text
      17              : 
      18            9 :       write (*, '(a)') ' ----------------------------------------------------------------'
      19            9 :       write (*, '(a)') ' '
      20            9 :       write (*, '(a)') ' '//text
      21            9 :       write (*, '(a)') ' '
      22            9 :       write (*, '(a)') ' ----------------------------------------------------------------'
      23              : 
      24           10 :    end subroutine header
      25              : 
      26           90 :    subroutine should_print0(affix, a, z)
      27              :       character(len=*), intent(in) :: affix  ! to insert ' approximately'
      28              :       real(dp), intent(in) :: a, z
      29              : 
      30              :       write (*, '(2(a),1(1pd26.16),a,99(1pd26.16))') &
      31           90 :          ' Should print', affix, a, '  :  ', z
      32           90 :       write (*, '(a)') ''
      33           90 :    end subroutine should_print0
      34              : 
      35           51 :    subroutine should_print1(affix, a, b, z)
      36              :       character(len=*), intent(in) :: affix  ! to insert ' approximately'
      37              :       real(dp), intent(in) :: a, b
      38              :       type(auto_diff_real_1var_order1), intent(in) :: z
      39              : 
      40              :       write (*, '(2(a),2(1pd26.16),a,99(1pd26.16))') &
      41           51 :          ' Should print', affix, a, b, '  :  ', z
      42           51 :       write (*, '(a)') ''
      43           51 :    end subroutine should_print1
      44              : 
      45           65 :    subroutine should_print2(affix, a, b, c, z)
      46              :       character(len=*), intent(in) :: affix  ! to insert ' approximately'
      47              :       real(dp), intent(in) :: a, b, c
      48              :       type(auto_diff_real_2var_order1), intent(in) :: z
      49              :       write (*, '(2(a),3(1pd26.16),a,99(1pd26.16))') &
      50           65 :          ' Should print', affix, a, b, c, '  :  ', z
      51           65 :       write (*, '(a)') ''
      52           65 :    end subroutine should_print2
      53              : 
      54            1 :    subroutine do_test_auto_diff_star_order1()
      55              :       type(auto_diff_real_star_order1) :: x, y, z
      56              :       integer :: i
      57              : 
      58            1 :       call header('Testing assignment')
      59            1 :       x = 3d0
      60            1 :       x%d1Array(4) = 1d0
      61           16 :       do i = 1, 15
      62           16 :          if (i /= 4) then
      63           14 :             call should_print0('', 0d0, x%d1Array(i))
      64              :          else
      65            1 :             call should_print0('', 1d0, x%d1Array(i))
      66              :          end if
      67              :       end do
      68              : 
      69            1 :       call header('Testing unary operators')
      70              : 
      71            1 :       write (*, *) 'Test y = x**2'
      72            1 :       x = 3d0
      73           16 :       do i = 1, 15
      74           16 :          x%d1Array(i) = 1d0*i
      75              :       end do
      76            1 :       y = pow2(x)
      77           16 :       do i = 1, 15
      78           16 :          call should_print0('', 6d0*i, y%d1Array(i))
      79              :       end do
      80              : 
      81            1 :       write (*, *) 'Test x = x**2'
      82            1 :       x = pow2(x)
      83           16 :       do i = 1, 15
      84           16 :          call should_print0('', 6d0*i, x%d1Array(i))
      85              :       end do
      86              : 
      87            1 :       call header('Testing binary operators')
      88              : 
      89            1 :       write (*, *) 'Test y = x + 1d0'
      90            1 :       x = 3d0
      91           16 :       do i = 1, 15
      92           16 :          x%d1Array(i) = 1d0*i
      93              :       end do
      94            1 :       y = x + 1d0
      95           16 :       do i = 1, 15
      96           16 :          call should_print0('', 1d0*i, y%d1Array(i))
      97              :       end do
      98              : 
      99            1 :       write (*, *) 'Test y = x + x'
     100            1 :       x = 3d0
     101           16 :       do i = 1, 15
     102           16 :          x%d1Array(i) = 1d0*i
     103              :       end do
     104            1 :       y = x + x
     105           16 :       do i = 1, 15
     106           16 :          call should_print0('', 2d0*i, y%d1Array(i))
     107              :       end do
     108              : 
     109            1 :       write (*, *) 'Test y = exp(x) * z'
     110            1 :       x = 3d0
     111            1 :       z = 2d0
     112           16 :       do i = 1, 15
     113           15 :          x%d1Array(i) = 1d0*i
     114           16 :          z%d1Array(i) = 1d0 - i
     115              :       end do
     116            1 :       y = exp(x)*z
     117           16 :       do i = 1, 15
     118           16 :          call should_print0('', exp(3d0)*(1d0*i)*2d0 + (1d0 - i)*exp(3d0), y%d1Array(i))
     119              :       end do
     120              : 
     121            1 :    end subroutine do_test_auto_diff_star_order1
     122              : 
     123            1 :    subroutine do_test_auto_diff_1var_order1()
     124              :       type(auto_diff_real_1var_order1) :: x, y, z
     125              : 
     126            1 :       call header('Testing assignment and comparison')
     127              : 
     128            1 :       write (*, *) 'Test real -> auto_diff_real_1var_order1 assignment'
     129            1 :       x = 3.1d0
     130            1 :       call should_print1('', 3.1d0, 0d0, x)
     131              : 
     132            1 :       write (*, *) 'Test auto_diff_real_1var_order1 == auto_diff_real_1var_order1'
     133            1 :       y = 3.1d0
     134            1 :       write (*, *) 'Should print T:', (x == y)
     135            1 :       write (*, *) ''
     136              : 
     137            1 :       write (*, *) 'Test auto_diff_real_1var_order1 > auto_diff_real_1var_order1'
     138            1 :       y = 2.9d0
     139            1 :       write (*, *) 'Should print T:', (x > y)
     140            1 :       write (*, *) ''
     141              : 
     142            1 :       write (*, *) 'Test auto_diff_real_1var_order1 < auto_diff_real_1var_order1'
     143            1 :       write (*, *) 'Should print F:', (x < y)
     144            1 :       write (*, *) ''
     145              : 
     146            1 :       write (*, *) 'Test auto_diff_real_1var_order1 >= auto_diff_real_1var_order1'
     147            1 :       write (*, *) 'Should print T:', (x >= y)
     148            1 :       write (*, *) ''
     149              : 
     150            1 :       write (*, *) 'Test auto_diff_real_1var_order1 <= auto_diff_real_1var_order1'
     151            1 :       write (*, *) 'Should print F:', (x <= y)
     152            1 :       write (*, *) ''
     153              : 
     154            1 :       write (*, *) 'Test auto_diff_real_1var_order1 >= auto_diff_real_1var_order1'
     155            1 :       y = 3.1d0
     156            1 :       write (*, *) 'Should print T:', (x >= y)
     157            1 :       write (*, *) ''
     158              : 
     159            1 :       write (*, *) 'Test auto_diff_real_1var_order1 <= auto_diff_real_1var_order1'
     160            1 :       write (*, *) 'Should print T:', (x <= y)
     161            1 :       write (*, *) ''
     162              : 
     163            1 :       write (*, *) 'Test auto_diff_real_1var_order1 == real(dp)'
     164            1 :       write (*, *) 'Should print T:', (x == 3.1d0)
     165            1 :       write (*, *) ''
     166              : 
     167            1 :       write (*, *) 'Test auto_diff_real_1var_order1 > real(dp)'
     168            1 :       write (*, *) 'Should print T:', (x > 2.9d0)
     169            1 :       write (*, *) ''
     170              : 
     171            1 :       write (*, *) 'Test auto_diff_real_1var_order1 < real(dp)'
     172            1 :       write (*, *) 'Should print F:', (x < 2.9d0)
     173            1 :       write (*, *) ''
     174              : 
     175            1 :       write (*, *) 'Test auto_diff_real_1var_order1 >= real(dp)'
     176            1 :       write (*, *) 'Should print T:', (x >= 2.9d0)
     177            1 :       write (*, *) ''
     178              : 
     179            1 :       write (*, *) 'Test auto_diff_real_1var_order1 <= real(dp)'
     180            1 :       write (*, *) 'Should print F:', (x <= 2.9d0)
     181            1 :       write (*, *) ''
     182              : 
     183            1 :       write (*, *) 'Test auto_diff_real_1var_order1 >= real(dp)'
     184            1 :       write (*, *) 'Should print T:', (x >= 3.1d0)
     185            1 :       write (*, *) ''
     186              : 
     187            1 :       write (*, *) 'Test auto_diff_real_1var_order1 <= real(dp)'
     188            1 :       write (*, *) 'Should print T:', (x <= 3.1d0)
     189            1 :       write (*, *) ''
     190              : 
     191            1 :       write (*, *) 'Test auto_diff_real_1var_order1 == integer'
     192            1 :       x = 3
     193            1 :       write (*, *) 'Should print T:', (x == 3)
     194            1 :       write (*, *) ''
     195              : 
     196            1 :       write (*, *) 'Test auto_diff_real_1var_order1 > integer'
     197            1 :       write (*, *) 'Should print T:', (x > 2)
     198            1 :       write (*, *) ''
     199              : 
     200            1 :       write (*, *) 'Test auto_diff_real_1var_order1 < integer'
     201            1 :       write (*, *) 'Should print F:', (x < 2)
     202            1 :       write (*, *) ''
     203              : 
     204            1 :       write (*, *) 'Test auto_diff_real_1var_order1 >= integer'
     205            1 :       write (*, *) 'Should print T:', (x >= 3)
     206            1 :       write (*, *) ''
     207              : 
     208            1 :       write (*, *) 'Test auto_diff_real_1var_order1 <= integer'
     209            1 :       write (*, *) 'Should print F:', (x <= 2)
     210            1 :       write (*, *) ''
     211              : 
     212            1 :       write (*, *) 'Test auto_diff_real_1var_order1 >= integer'
     213            1 :       write (*, *) 'Should print T:', (x >= 2)
     214            1 :       write (*, *) ''
     215              : 
     216            1 :       write (*, *) 'Test auto_diff_real_1var_order1 <= integer'
     217            1 :       write (*, *) 'Should print T:', (x <= 3)
     218            1 :       write (*, *) ''
     219              : 
     220            1 :       call header('Testing binary operators')
     221              : 
     222            1 :       write (*, *) 'Test auto_diff_real_1var_order1+auto_diff_real_1var_order1'
     223            1 :       x = 1d0
     224            1 :       x%d1val1 = 1d0
     225            1 :       y = 2d0
     226            1 :       y%d1val1 = 1d0
     227            1 :       z = x + y
     228            1 :       call should_print1('', 3d0, 2d0, z)
     229              : 
     230            1 :       write (*, *) 'Test auto_diff_real_1var_order1+real(dp)'
     231            1 :       x = 1d0
     232            1 :       x%d1val1 = 1d0
     233            1 :       z = x + 2d0
     234            1 :       call should_print1('', 3d0, 1d0, z)
     235              : 
     236            1 :       write (*, *) 'Test real(dp)+auto_diff_real_1var_order1'
     237            1 :       x = 1d0
     238            1 :       x%d1val1 = 1d0
     239            1 :       z = 2d0 + x
     240            1 :       call should_print1('', 3d0, 1d0, z)
     241              : 
     242            1 :       write (*, *) 'Test auto_diff_real_1var_order1*auto_diff_real_1var_order1'
     243            1 :       x = 3d0
     244            1 :       x%d1val1 = 1d0
     245            1 :       y = 2d0
     246            1 :       y%d1val1 = 1d0
     247            1 :       z = x*y
     248            1 :       call should_print1('', 6d0, 5d0, z)
     249              : 
     250            1 :       write (*, *) 'Test auto_diff_real_1var_order1*real(dp)'
     251            1 :       x = 3d0
     252            1 :       x%d1val1 = 1d0
     253            1 :       z = x*2d0
     254            1 :       call should_print1('', 6d0, 2d0, z)
     255              : 
     256            1 :       write (*, *) 'Test real(dp)*auto_diff_real_1var_order1'
     257            1 :       x = 3d0
     258            1 :       x%d1val1 = 1d0
     259            1 :       z = 2d0*x
     260            1 :       call should_print1('', 6d0, 2d0, z)
     261              : 
     262            1 :       write (*, *) 'Test max(auto_diff_real_1var_order1, auto_diff_real_1var_order1)'
     263            1 :       x = 1d0
     264            1 :       x%d1val1 = 1d0
     265            1 :       y = 2d0
     266            1 :       y%d1val1 = 2d0
     267            1 :       z = max(x, y)
     268            1 :       call should_print1('', 2d0, 2d0, z)
     269              : 
     270            1 :       write (*, *) 'Test max(auto_diff_real_1var_order1, real(dp))'
     271            1 :       x = 1d0
     272            1 :       x%d1val1 = 1d0
     273            1 :       z = max(x, 2d0)
     274            1 :       call should_print1('', 2d0, 0d0, z)
     275              : 
     276            1 :       write (*, *) 'Test max(auto_diff_real_1var_order1, real(dp))'
     277            1 :       x = 1d0
     278            1 :       x%d1val1 = 1d0
     279            1 :       z = max(x, 0d0)
     280            1 :       call should_print1('', 1d0, 1d0, z)
     281              : 
     282            1 :       write (*, *) 'Test max(real(dp), auto_diff_real_1var_order1)'
     283            1 :       x = 1d0
     284            1 :       x%d1val1 = 1d0
     285            1 :       z = max(2d0, x)
     286            1 :       call should_print1('', 2d0, 0d0, z)
     287              : 
     288            1 :       write (*, *) 'Test max(real(dp), auto_diff_real_1var_order1)'
     289            1 :       x = 1d0
     290            1 :       x%d1val1 = 1d0
     291            1 :       z = max(0d0, x)
     292            1 :       call should_print1('', 1d0, 1d0, z)
     293              : 
     294            1 :       write (*, *) 'Test dim(auto_diff_real_1var_order1, auto_diff_real_1var_order1)'
     295            1 :       x = 2d0
     296            1 :       x%d1val1 = 2d0
     297            1 :       y = 1d0
     298            1 :       y%d1val1 = 1d0
     299            1 :       z = dim(x, y)
     300            1 :       call should_print1('', 1d0, 1d0, z)
     301              : 
     302            1 :       write (*, *) 'Test dim(auto_diff_real_1var_order1, auto_diff_real_1var_order1)'
     303            1 :       x = 2d0
     304            1 :       x%d1val1 = 2d0
     305            1 :       y = 1d0
     306            1 :       y%d1val1 = 1d0
     307            1 :       z = dim(y, x)
     308            1 :       call should_print1('', 0d0, 0d0, z)
     309              : 
     310            1 :       write (*, *) 'Test dim(auto_diff_real_1var_order1, real(dp))'
     311            1 :       x = 2d0
     312            1 :       x%d1val1 = 2d0
     313            1 :       z = dim(x, 1d0)
     314            1 :       call should_print1('', 1d0, 2d0, z)
     315              : 
     316            1 :       call header('Testing unary operators')
     317              : 
     318            1 :       write (*, *) 'Testing exp(auto_diff_real_1var_order1)'
     319            1 :       x = 1d0
     320            1 :       x%d1val1 = 1d0
     321            1 :       x = exp(x)
     322            1 :       call should_print1('', exp(1d0), exp(1d0), x)
     323              : 
     324            1 :       write (*, *) 'Testing abs(auto_diff_real_1var_order1)'
     325            1 :       x = 1d0
     326            1 :       x%d1val1 = 1d0
     327            1 :       x = abs(x)
     328            1 :       call should_print1('', 1d0, 1d0, x)
     329              : 
     330            1 :       write (*, *) 'Testing abs(auto_diff_real_1var_order1)'
     331            1 :       x = -1d0
     332            1 :       x%d1val1 = 1d0
     333            1 :       x = abs(x)
     334            1 :       call should_print1('', 1d0, -1d0, x)
     335              : 
     336            1 :       write (*, *) 'Testing exp(auto_diff_real_1var_order1)'
     337            1 :       x = 2d0
     338            1 :       x%d1val1 = 1d0
     339            1 :       x = exp(x)
     340            1 :       call should_print1('', exp(2d0), exp(2d0), x)
     341              : 
     342            1 :       write (*, *) 'Testing sin(auto_diff_real_1var_order1)'
     343            1 :       x = pi
     344            1 :       x%d1val1 = 1d0
     345            1 :       x = sin(x)
     346            1 :       call should_print1('', sin(pi), cos(pi), x)
     347              : 
     348            1 :       write (*, *) 'Testing cos(auto_diff_real_1var_order1)'
     349            1 :       x = pi
     350            1 :       x%d1val1 = 1d0
     351            1 :       x = cos(x)
     352            1 :       call should_print1('', cos(pi), -sin(pi), x)
     353              : 
     354            1 :       write (*, *) 'Testing tan(auto_diff_real_1var_order1)'
     355            1 :       x = pi
     356            1 :       x%d1val1 = 1d0
     357            1 :       x = tan(x)
     358            1 :       call should_print1(' approximately', tan(pi), 1/pow2(cos(pi)), x)
     359              : 
     360            1 :       write (*, *) 'Testing sinh(auto_diff_real_1var_order1)'
     361            1 :       x = pi
     362            1 :       x%d1val1 = 1d0
     363            1 :       x = sinh(x)
     364            1 :       call should_print1('', sinh(pi), cosh(pi), x)
     365              : 
     366            1 :       write (*, *) 'Testing cosh(auto_diff_real_1var_order1)'
     367            1 :       x = pi
     368            1 :       x%d1val1 = 1d0
     369            1 :       x = cosh(x)
     370            1 :       call should_print1('', cosh(pi), sinh(pi), x)
     371              : 
     372            1 :       write (*, *) 'Testing tanh(auto_diff_real_1var_order1)'
     373            1 :       x = pi
     374            1 :       x%d1val1 = 1d0
     375            1 :       x = tanh(x)
     376            1 :       call should_print1(' approximately', tanh(pi), 1/pow2(cosh(pi)), x)
     377              : 
     378            1 :       write (*, *) 'Testing asin(auto_diff_real_1var_order1)'
     379            1 :       x = 0.5d0
     380            1 :       x%d1val1 = 1d0
     381            1 :       x = asin(x)
     382            1 :       call should_print1('', asin(0.5d0), 2d0/sqrt(3d0), x)
     383              : 
     384            1 :       write (*, *) 'Testing acos(auto_diff_real_1var_order1)'
     385            1 :       x = 0.5d0
     386            1 :       x%d1val1 = 1d0
     387            1 :       x = acos(x)
     388            1 :       call should_print1('', acos(0.5d0), -2d0/sqrt(3d0), x)
     389              : 
     390            1 :       write (*, *) 'Testing atan(auto_diff_real_1var_order1)'
     391            1 :       x = 0.5d0
     392            1 :       x%d1val1 = 1d0
     393            1 :       x = atan(x)
     394            1 :       call should_print1(' approximately', atan(0.5d0), 4d0/5d0, x)
     395              : 
     396            1 :       write (*, *) 'Testing asinh(auto_diff_real_1var_order1)'
     397            1 :       x = 2d0
     398            1 :       x%d1val1 = 1d0
     399            1 :       x = asinh(x)
     400            1 :       call should_print1(' approximately', asinh(2d0), 1d0/sqrt(5d0), x)
     401              : 
     402            1 :       write (*, *) 'Testing acosh(auto_diff_real_1var_order1)'
     403            1 :       x = 2d0
     404            1 :       x%d1val1 = 1d0
     405            1 :       x = acosh(x)
     406            1 :       call should_print1(' approximately', acosh(2d0), 1d0/sqrt(3d0), x)
     407              : 
     408            1 :       write (*, *) 'Testing atanh(auto_diff_real_1var_order1)'
     409            1 :       x = 0.5d0
     410            1 :       x%d1val1 = 1d0
     411            1 :       x = atanh(x)
     412            1 :       call should_print1(' approximately', atanh(0.5d0), 4d0/3d0, x)
     413              : 
     414            1 :       write (*, *) 'Testing unary_minus(auto_diff_real_1var_order1)'
     415            1 :       x = 1d0
     416            1 :       x%d1val1 = 1d0
     417            1 :       x = -x
     418            1 :       call should_print1('', -1d0, -1d0, x)
     419              : 
     420            1 :       write (*, *) 'Testing unary_minus(auto_diff_real_1var_order1)'
     421            1 :       x = -1d0
     422            1 :       x%d1val1 = 1d0
     423            1 :       x = -x
     424            1 :       call should_print1('', 1d0, -1d0, x)
     425              : 
     426            1 :       write (*, *) 'Testing log(auto_diff_real_1var_order1)'
     427            1 :       x = 1d0
     428            1 :       x%d1val1 = 1d0
     429            1 :       x = log(x)
     430            1 :       call should_print1('', 0d0, 1d0, x)
     431              : 
     432            1 :       write (*, *) 'Testing safe_log(auto_diff_real_1var_order1)'
     433            1 :       x = 1d0
     434            1 :       x%d1val1 = 1d0
     435            1 :       x = log(x)
     436            1 :       call should_print1('', 0d0, 1d0, x)
     437              : 
     438            1 :       write (*, *) 'Testing log10(auto_diff_real_1var_order1)'
     439            1 :       x = 1d1
     440            1 :       x%d1val1 = 1d0
     441            1 :       x = log10(x)
     442            1 :       call should_print1('', 1d0, 1d0/(10*ln10), x)
     443              : 
     444            1 :       write (*, *) 'Testing safe_log10(auto_diff_real_1var_order1)'
     445            1 :       x = 1d1
     446            1 :       x%d1val1 = 1d0
     447            1 :       x = safe_log10(x)
     448            1 :       call should_print1('', 1d0, 1d0/(10*ln10), x)
     449              : 
     450            1 :       write (*, *) 'Testing log(auto_diff_real_1var_order1)'
     451            1 :       x = exp(1d0)
     452            1 :       x%d1val1 = 1d0
     453            1 :       x = log(x)
     454            1 :       call should_print1('', 1d0, exp(-1d0), x)
     455              : 
     456            1 :       write (*, *) 'Testing safe_log(auto_diff_real_1var_order1)'
     457            1 :       x = exp(1d0)
     458            1 :       x%d1val1 = 1d0
     459            1 :       x = log(x)
     460            1 :       call should_print1(' approximately', 1d0, exp(-1d0), x)
     461              : 
     462            1 :       write (*, *) 'Testing log10(auto_diff_real_1var_order1)'
     463            1 :       x = 1d2
     464            1 :       x%d1val1 = 1d0
     465            1 :       x = log10(x)
     466            1 :       call should_print1(' approximately', 2d0, 1d0/(100*ln10), x)
     467              : 
     468            1 :       write (*, *) 'Testing safe_log10(auto_diff_real_1var_order1)'
     469            1 :       x = 1d2
     470            1 :       x%d1val1 = 1d0
     471            1 :       x = log10(x)
     472            1 :       call should_print1(' approximately', 2d0, 1d0/(100*ln10), x)
     473              : 
     474            1 :       write (*, *) 'Testing pow2(auto_diff_real_1var_order1)'
     475            1 :       x = 3d0
     476            1 :       x%d1val1 = 1d0
     477            1 :       x = pow2(x)
     478            1 :       call should_print1(' approximately', 9d0, 6d0, x)
     479              : 
     480            1 :       write (*, *) 'Testing pow3(auto_diff_real_1var_order1)'
     481            1 :       x = 2d0
     482            1 :       x%d1val1 = 1d0
     483            1 :       x = pow3(x)
     484            1 :       call should_print1('', 8d0, 3*4d0, x)
     485              : 
     486            1 :       write (*, *) 'Testing pow4(auto_diff_real_1var_order1)'
     487            1 :       x = 2d0
     488            1 :       x%d1val1 = 1d0
     489            1 :       x = pow4(x)
     490            1 :       call should_print1('', 16d0, 4*8d0, x)
     491              : 
     492            1 :       write (*, *) 'Testing pow5(auto_diff_real_1var_order1)'
     493            1 :       x = 3d0
     494            1 :       x%d1val1 = 1d0
     495            1 :       x = pow5(x)
     496            1 :       call should_print1('', 243d0, 405d0, x)
     497              : 
     498            1 :       write (*, *) 'Testing pow6(auto_diff_real_1var_order1)'
     499            1 :       x = 2d0
     500            1 :       x%d1val1 = 1d0
     501            1 :       x = pow6(x)
     502            1 :       call should_print1('', 64d0, 6*32d0, x)
     503              : 
     504            1 :       write (*, *) 'Testing pow7(auto_diff_real_1var_order1)'
     505            1 :       x = 2d0
     506            1 :       x%d1val1 = 1d0
     507            1 :       x = pow7(x)
     508            1 :       call should_print1('', 128d0, 7*64d0, x)
     509              : 
     510            1 :       write (*, *) 'Testing pow(auto_diff_real_1var_order1, real(dp))'
     511            1 :       x = 4d0
     512            1 :       x%d1val1 = 1d0
     513            1 :       x = pow(x, 0.5d0)
     514            1 :       call should_print1(' approximately', 2d0, 0.25d0, x)
     515              : 
     516            1 :       write (*, *) 'Testing pow(real(dp), auto_diff_real_1var_order1)'
     517            1 :       x = 2d0
     518            1 :       x%d1val1 = 1d0
     519            1 :       x = pow(exp(1d0), x)
     520            1 :       call should_print1(' approximately', exp(2d0), exp(2d0), x)
     521              : 
     522            1 :       write (*, *) 'Testing pow(auto_diff_real_1var_order1, integer)'
     523            1 :       x = 4d0
     524            1 :       x%d1val1 = 1d0
     525            1 :       x = pow(x, 2d0)
     526            1 :       call should_print1('', 16d0, 8d0, x)
     527              : 
     528            1 :       write (*, *) 'Testing pow(integer, auto_diff_real_1var_order1)'
     529            1 :       x = 2d0
     530            1 :       x%d1val1 = 1d0
     531            1 :       x = pow(2d0, x)
     532            1 :       call should_print1('', 4d0, 4d0*log(2d0), x)
     533              : 
     534            1 :    end subroutine do_test_auto_diff_1var_order1
     535              : 
     536            1 :    subroutine do_test_auto_diff_2var_order1()
     537              :       type(auto_diff_real_2var_order1) :: x, y, z
     538              : 
     539            1 :       call header('Testing assignment and comparison')
     540              : 
     541            1 :       write (*, *) 'Test real -> auto_diff_real_2var_order1 assignment'
     542            1 :       x = 3.1d0
     543            1 :       call should_print2('', 3.1d0, 0d0, 0d0, x)
     544              : 
     545            1 :       write (*, *) 'Test auto_diff_real_2var_order1 == auto_diff_real_2var_order1'
     546            1 :       y = 3.1d0
     547            1 :       write (*, *) 'Should print T:', (x == y)
     548            1 :       write (*, *) ''
     549              : 
     550            1 :       write (*, *) 'Test auto_diff_real_2var_order1 > auto_diff_real_2var_order1'
     551            1 :       y = 2.9d0
     552            1 :       write (*, *) 'Should print T:', (x > y)
     553            1 :       write (*, *) ''
     554              : 
     555            1 :       write (*, *) 'Test auto_diff_real_2var_order1 < auto_diff_real_2var_order1'
     556            1 :       write (*, *) 'Should print F:', (x < y)
     557            1 :       write (*, *) ''
     558              : 
     559            1 :       write (*, *) 'Test auto_diff_real_2var_order1 >= auto_diff_real_2var_order1'
     560            1 :       write (*, *) 'Should print T:', (x >= y)
     561            1 :       write (*, *) ''
     562              : 
     563            1 :       write (*, *) 'Test auto_diff_real_2var_order1 <= auto_diff_real_2var_order1'
     564            1 :       write (*, *) 'Should print F:', (x <= y)
     565            1 :       write (*, *) ''
     566              : 
     567            1 :       write (*, *) 'Test auto_diff_real_2var_order1 >= auto_diff_real_2var_order1'
     568            1 :       y = 3.1d0
     569            1 :       write (*, *) 'Should print T:', (x >= y)
     570            1 :       write (*, *) ''
     571              : 
     572            1 :       write (*, *) 'Test auto_diff_real_2var_order1 <= auto_diff_real_2var_order1'
     573            1 :       write (*, *) 'Should print T:', (x <= y)
     574            1 :       write (*, *) ''
     575              : 
     576            1 :       write (*, *) 'Test auto_diff_real_2var_order1 == real(dp)'
     577            1 :       write (*, *) 'Should print T:', (x == 3.1d0)
     578            1 :       write (*, *) ''
     579              : 
     580            1 :       write (*, *) 'Test auto_diff_real_2var_order1 > real(dp)'
     581            1 :       write (*, *) 'Should print T:', (x > 2.9d0)
     582            1 :       write (*, *) ''
     583              : 
     584            1 :       write (*, *) 'Test auto_diff_real_2var_order1 < real(dp)'
     585            1 :       write (*, *) 'Should print F:', (x < 2.9d0)
     586            1 :       write (*, *) ''
     587              : 
     588            1 :       write (*, *) 'Test auto_diff_real_2var_order1 >= real(dp)'
     589            1 :       write (*, *) 'Should print T:', (x >= 2.9d0)
     590            1 :       write (*, *) ''
     591              : 
     592            1 :       write (*, *) 'Test auto_diff_real_2var_order1 <= real(dp)'
     593            1 :       write (*, *) 'Should print F:', (x <= 2.9d0)
     594            1 :       write (*, *) ''
     595              : 
     596            1 :       write (*, *) 'Test auto_diff_real_2var_order1 >= real(dp)'
     597            1 :       write (*, *) 'Should print T:', (x >= 3.1d0)
     598            1 :       write (*, *) ''
     599              : 
     600            1 :       write (*, *) 'Test auto_diff_real_2var_order1 <= real(dp)'
     601            1 :       write (*, *) 'Should print T:', (x <= 3.1d0)
     602            1 :       write (*, *) ''
     603              : 
     604            1 :       write (*, *) 'Test auto_diff_real_2var_order1 == integer'
     605            1 :       x = 3
     606            1 :       write (*, *) 'Should print T:', (x == 3)
     607            1 :       write (*, *) ''
     608              : 
     609            1 :       write (*, *) 'Test auto_diff_real_2var_order1 > integer'
     610            1 :       write (*, *) 'Should print T:', (x > 2)
     611            1 :       write (*, *) ''
     612              : 
     613            1 :       write (*, *) 'Test auto_diff_real_2var_order1 < integer'
     614            1 :       write (*, *) 'Should print F:', (x < 2)
     615            1 :       write (*, *) ''
     616              : 
     617            1 :       write (*, *) 'Test auto_diff_real_2var_order1 >= integer'
     618            1 :       write (*, *) 'Should print T:', (x >= 3)
     619            1 :       write (*, *) ''
     620              : 
     621            1 :       write (*, *) 'Test auto_diff_real_2var_order1 <= integer'
     622            1 :       write (*, *) 'Should print F:', (x <= 2)
     623            1 :       write (*, *) ''
     624              : 
     625            1 :       write (*, *) 'Test auto_diff_real_2var_order1 >= integer'
     626            1 :       write (*, *) 'Should print T:', (x >= 2)
     627            1 :       write (*, *) ''
     628              : 
     629            1 :       write (*, *) 'Test auto_diff_real_2var_order1 <= integer'
     630            1 :       write (*, *) 'Should print T:', (x <= 3)
     631            1 :       write (*, *) ''
     632              : 
     633            1 :       call header('Testing binary operators')
     634              : 
     635            1 :       write (*, *) 'Test auto_diff_real_2var_order1+auto_diff_real_2var_order1'
     636            1 :       x = 1d0
     637            1 :       x%d1val1 = 1d0
     638            1 :       y = 2d0
     639            1 :       y%d1val1 = 1d0
     640            1 :       z = x + y
     641            1 :       call should_print2('', 3d0, 2d0, 0d0, z)
     642              : 
     643            1 :       write (*, *) 'Test auto_diff_real_2var_order1+real(dp)'
     644            1 :       x = 1d0
     645            1 :       x%d1val1 = 1d0
     646            1 :       z = x + 2d0
     647            1 :       call should_print2('', 3d0, 1d0, 0d0, z)
     648              : 
     649            1 :       write (*, *) 'Test real(dp)+auto_diff_real_2var_order1'
     650            1 :       x = 1d0
     651            1 :       x%d1val1 = 1d0
     652            1 :       z = 2d0 + x
     653            1 :       call should_print2('', 3d0, 1d0, 0d0, z)
     654              : 
     655            1 :       write (*, *) 'Test auto_diff_real_2var_order1+integer'
     656            1 :       x = 1d0
     657            1 :       x%d1val1 = 1d0
     658            1 :       z = x + 2
     659            1 :       call should_print2('', 3d0, 1d0, 0d0, z)
     660              : 
     661            1 :       write (*, *) 'Test integer+auto_diff_real_2var_order1'
     662            1 :       x = 1d0
     663            1 :       x%d1val1 = 1d0
     664            1 :       z = 2 + x
     665            1 :       call should_print2('', 3d0, 1d0, 0d0, z)
     666              : 
     667            1 :       write (*, *) 'Test auto_diff_real_2var_order1*auto_diff_real_2var_order1'
     668            1 :       x = 3d0
     669            1 :       x%d1val1 = 1d0
     670            1 :       y = 2d0
     671            1 :       y%d1val2 = 1d0
     672            1 :       z = x*y
     673            1 :       call should_print2('', 6d0, 2d0, 3d0, z)
     674              : 
     675            1 :       write (*, *) 'Test auto_diff_real_2var_order1*real(dp)'
     676            1 :       x = 3d0
     677            1 :       x%d1val1 = 1d0
     678            1 :       z = x*2d0
     679            1 :       call should_print2('', 6d0, 2d0, 0d0, z)
     680              : 
     681            1 :       write (*, *) 'Test auto_diff_real_2var_order1/auto_diff_real_2var_order1'
     682            1 :       x = 3d0
     683            1 :       x%d1val1 = 1d0
     684            1 :       y = 2d0
     685            1 :       y%d1val2 = 1d0
     686            1 :       z = x/y
     687            1 :       call should_print2('', 1.5d0, 0.5d0, -0.75d0, z)
     688              : 
     689            1 :       write (*, *) 'Test auto_diff_real_2var_order1/real(dp)'
     690            1 :       x = 3d0
     691            1 :       x%d1val1 = 1d0
     692            1 :       z = x/2d0
     693            1 :       call should_print2('', 1.5d0, 0.5d0, 0d0, z)
     694              : 
     695            1 :       write (*, *) 'Test auto_diff_real_2var_order1-auto_diff_real_2var_order1'
     696            1 :       x = 1d0
     697            1 :       x%d1val1 = 1d0
     698            1 :       y = 2d0
     699            1 :       y%d1val2 = 1d0
     700            1 :       z = x - y
     701            1 :       call should_print2('', -1d0, 1d0, -1d0, z)
     702              : 
     703            1 :       write (*, *) 'Test auto_diff_real_2var_order1-auto_diff_real_2var_order1'
     704            1 :       x = 1d0
     705            1 :       x%d1val1 = 1d0
     706            1 :       y = 5d0
     707            1 :       y%d1val2 = 2d0
     708            1 :       z = x - y
     709            1 :       call should_print2('', -4d0, 1d0, -2d0, z)
     710              : 
     711            1 :       write (*, *) 'Test auto_diff_real_2var_order1-real(dp)'
     712            1 :       x = 2d0
     713            1 :       x%d1val1 = 1d0
     714            1 :       z = x - 1d0
     715            1 :       call should_print2('', 1d0, 1d0, 0d0, z)
     716              : 
     717            1 :       write (*, *) 'Test real(dp)*auto_diff_real_2var_order1'
     718            1 :       x = 3d0
     719            1 :       x%d1val1 = 1d0
     720            1 :       z = 2d0*x
     721            1 :       call should_print2('', 6d0, 2d0, 0d0, z)
     722              : 
     723            1 :       write (*, *) 'Test max(auto_diff_real_2var_order1, auto_diff_real_2var_order1)'
     724            1 :       x = 1d0
     725            1 :       x%d1val1 = 1d0
     726            1 :       y = 2d0
     727            1 :       y%d1val2 = 2d0
     728            1 :       z = max(x, y)
     729            1 :       call should_print2('', 2d0, 0d0, 2d0, z)
     730              : 
     731            1 :       write (*, *) 'Test max(auto_diff_real_2var_order1, real(dp))'
     732            1 :       x = 1d0
     733            1 :       x%d1val1 = 1d0
     734            1 :       z = max(x, 2d0)
     735            1 :       call should_print2('', 2d0, 0d0, 0d0, z)
     736              : 
     737            1 :       write (*, *) 'Test max(auto_diff_real_2var_order1, real(dp))'
     738            1 :       x = 1d0
     739            1 :       x%d1val1 = 1d0
     740            1 :       z = max(x, 0d0)
     741            1 :       call should_print2('', 1d0, 1d0, 0d0, z)
     742              : 
     743            1 :       write (*, *) 'Test max(real(dp), auto_diff_real_2var_order1)'
     744            1 :       x = 1d0
     745            1 :       x%d1val1 = 1d0
     746            1 :       z = max(2d0, x)
     747            1 :       call should_print2('', 2d0, 0d0, 0d0, z)
     748              : 
     749            1 :       write (*, *) 'Test max(real(dp), auto_diff_real_2var_order1)'
     750            1 :       x = 1d0
     751            1 :       x%d1val1 = 1d0
     752            1 :       z = max(0d0, x)
     753            1 :       call should_print2('', 1d0, 1d0, 0d0, z)
     754              : 
     755            1 :       write (*, *) 'Test min(auto_diff_real_2var_order1, auto_diff_real_2var_order1)'
     756            1 :       x = 1d0
     757            1 :       x%d1val1 = 1d0
     758            1 :       y = 2d0
     759            1 :       y%d1val2 = 2d0
     760            1 :       z = min(x, y)
     761            1 :       call should_print2('', 1d0, 1d0, 0d0, z)
     762              : 
     763            1 :       write (*, *) 'Test min(auto_diff_real_2var_order1, real(dp))'
     764            1 :       x = 1d0
     765            1 :       x%d1val1 = 1d0
     766            1 :       z = min(x, 2d0)
     767            1 :       call should_print2('', 1d0, 1d0, 0d0, z)
     768              : 
     769            1 :       write (*, *) 'Test min(auto_diff_real_2var_order1, real(dp))'
     770            1 :       x = 1d0
     771            1 :       x%d1val1 = 1d0
     772            1 :       z = min(x, 0d0)
     773            1 :       call should_print2('', 0d0, 0d0, 0d0, z)
     774              : 
     775            1 :       write (*, *) 'Test min(real(dp), auto_diff_real_2var_order1)'
     776            1 :       x = 1d0
     777            1 :       x%d1val1 = 1d0
     778            1 :       z = min(2d0, x)
     779            1 :       call should_print2('', 1d0, 1d0, 0d0, z)
     780              : 
     781            1 :       write (*, *) 'Test min(real(dp), auto_diff_real_2var_order1)'
     782            1 :       x = 1d0
     783            1 :       x%d1val1 = 1d0
     784            1 :       z = min(0d0, x)
     785            1 :       call should_print2('', 0d0, 0d0, 0d0, z)
     786            1 :       write (*, *) 'Test dim(auto_diff_real_2var_order1, auto_diff_real_2var_order1)'
     787            1 :       x = 2d0
     788            1 :       x%d1val1 = 2d0
     789            1 :       y = 1d0
     790            1 :       y%d1val2 = 1d0
     791            1 :       z = dim(x, y)
     792            1 :       call should_print2('', 1d0, 2d0, -1d0, z)
     793              : 
     794            1 :       write (*, *) 'Test dim(auto_diff_real_2var_order1, auto_diff_real_2var_order1)'
     795            1 :       x = 2d0
     796            1 :       x%d1val1 = 2d0
     797            1 :       y = 1d0
     798            1 :       y%d1val2 = 1d0
     799            1 :       z = dim(y, x)
     800            1 :       call should_print2('', 0d0, 0d0, 0d0, z)
     801              : 
     802            1 :       write (*, *) 'Test dim(auto_diff_real_2var_order1, real(dp))'
     803            1 :       x = 2d0
     804            1 :       x%d1val1 = 2d0
     805            1 :       z = dim(x, 1d0)
     806            1 :       call should_print2('', 1d0, 2d0, 0d0, z)
     807              : 
     808            1 :       write (*, *) 'Testing pow(auto_diff_real_2var_order1, auto_diff_real_2var_order1)'
     809            1 :       x = 2d0
     810            1 :       x%d1val1 = 1d0
     811            1 :       y = 2d0
     812            1 :       y%d1val2 = 1d0
     813            1 :       z = pow(x, y)
     814            1 :       call should_print2(' approximately', 4d0, 2d0*2d0, 4*log(2d0), z)
     815              : 
     816            1 :       call header('Testing unary operators')
     817              : 
     818            1 :       write (*, *) 'Testing exp(auto_diff_real_2var_order1)'
     819            1 :       x = 1d0
     820            1 :       x%d1val1 = 1d0
     821            1 :       x = exp(x)
     822            1 :       call should_print2('', exp(1d0), exp(1d0), 0d0, x)
     823              : 
     824            1 :       write (*, *) 'Testing exp(auto_diff_real_2var_order1)'
     825            1 :       x = 1d0
     826            1 :       x%d1val2 = 1d0
     827            1 :       x = exp(x)
     828            1 :       call should_print2('', exp(1d0), 0d0, exp(1d0), x)
     829              : 
     830            1 :       write (*, *) 'Testing exp(auto_diff_real_2var_order1)'
     831            1 :       x = 2d0
     832            1 :       x%d1val1 = 1d0
     833            1 :       x = exp(x)
     834            1 :       call should_print2('', exp(2d0), exp(2d0), 0d0, x)
     835              : 
     836            1 :       write (*, *) 'Testing abs(auto_diff_real_2var_order1)'
     837            1 :       x = 1d0
     838            1 :       x%d1val1 = 1d0
     839            1 :       x = abs(x)
     840            1 :       call should_print2('', 1d0, 1d0, 0d0, x)
     841              : 
     842            1 :       write (*, *) 'Testing abs(auto_diff_real_2var_order1)'
     843            1 :       x = -1d0
     844            1 :       x%d1val1 = 1d0
     845            1 :       x = abs(x)
     846            1 :       call should_print2('', 1d0, -1d0, 0d0, x)
     847              : 
     848            1 :       write (*, *) 'Testing sin(auto_diff_real_2var_order1)'
     849            1 :       x = pi
     850            1 :       x%d1val1 = 1d0
     851            1 :       x = sin(x)
     852            1 :       call should_print2('', sin(pi), cos(pi), 0d0, x)
     853              : 
     854            1 :       write (*, *) 'Testing cos(auto_diff_real_2var_order1)'
     855            1 :       x = pi
     856            1 :       x%d1val1 = 1d0
     857            1 :       x = cos(x)
     858            1 :       call should_print2('', cos(pi), -sin(pi), 0d0, x)
     859              : 
     860            1 :       write (*, *) 'Testing tan(auto_diff_real_2var_order1)'
     861            1 :       x = pi
     862            1 :       x%d1val1 = 1d0
     863            1 :       x = tan(x)
     864            1 :       call should_print2(' approximately', tan(pi), 1/pow2(cos(pi)), 0d0, x)
     865              : 
     866            1 :       write (*, *) 'Testing sinh(auto_diff_real_2var_order1)'
     867            1 :       x = pi
     868            1 :       x%d1val1 = 1d0
     869            1 :       x = sinh(x)
     870            1 :       call should_print2('', sinh(pi), cosh(pi), 0d0, x)
     871              : 
     872            1 :       write (*, *) 'Testing cosh(auto_diff_real_2var_order1)'
     873            1 :       x = pi
     874            1 :       x%d1val1 = 1d0
     875            1 :       x = cosh(x)
     876            1 :       call should_print2('', cosh(pi), sinh(pi), 0d0, x)
     877              : 
     878            1 :       write (*, *) 'Testing tanh(auto_diff_real_2var_order1)'
     879            1 :       x = pi
     880            1 :       x%d1val1 = 1d0
     881            1 :       x = tanh(x)
     882            1 :       call should_print2(' approximately', tanh(pi), 1/pow2(cosh(pi)), 0d0, x)
     883              : 
     884            1 :       write (*, *) 'Testing asin(auto_diff_real_2var_order1)'
     885            1 :       x = 0.5d0
     886            1 :       x%d1val1 = 1d0
     887            1 :       x = asin(x)
     888            1 :       call should_print2('', asin(0.5d0), 2d0/sqrt(3d0), 0d0, x)
     889              : 
     890            1 :       write (*, *) 'Testing acos(auto_diff_real_2var_order1)'
     891            1 :       x = 0.5d0
     892            1 :       x%d1val1 = 1d0
     893            1 :       x = acos(x)
     894            1 :       call should_print2('', acos(0.5d0), -2d0/sqrt(3d0), 0d0, x)
     895              : 
     896            1 :       write (*, *) 'Testing atan(auto_diff_real_2var_order1)'
     897            1 :       x = 0.5d0
     898            1 :       x%d1val1 = 1d0
     899            1 :       x = atan(x)
     900            1 :       call should_print2(' approximately', atan(0.5d0), 4d0/5d0, 0d0, x)
     901              : 
     902            1 :       write (*, *) 'Testing asinh(auto_diff_real_2var_order1)'
     903            1 :       x = 2d0
     904            1 :       x%d1val1 = 1d0
     905            1 :       x = asinh(x)
     906            1 :       call should_print2(' approximately', asinh(2d0), 1d0/sqrt(5d0), 0d0, x)
     907              : 
     908            1 :       write (*, *) 'Testing acosh(auto_diff_real_2var_order1)'
     909            1 :       x = 2d0
     910            1 :       x%d1val1 = 1d0
     911            1 :       x = acosh(x)
     912            1 :       call should_print2(' approximately', acosh(2d0), 1d0/sqrt(3d0), 0d0, x)
     913              : 
     914            1 :       write (*, *) 'Testing atanh(auto_diff_real_2var_order1)'
     915            1 :       x = 0.5d0
     916            1 :       x%d1val1 = 1d0
     917            1 :       x = atanh(x)
     918            1 :       call should_print2(' approximately', atanh(0.5d0), 4d0/3d0, 0d0, x)
     919              : 
     920            1 :       write (*, *) 'Testing unary_minus(auto_diff_real_2var_order1)'
     921            1 :       x = 1d0
     922            1 :       x%d1val1 = 1d0
     923            1 :       x = -x
     924            1 :       call should_print2('', -1d0, -1d0, 0d0, x)
     925              : 
     926            1 :       write (*, *) 'Testing unary_minus(auto_diff_real_2var_order1)'
     927            1 :       x = -1d0
     928            1 :       x%d1val1 = 1d0
     929            1 :       x = -x
     930            1 :       call should_print2('', 1d0, -1d0, 0d0, x)
     931              : 
     932            1 :       write (*, *) 'Testing log(auto_diff_real_2var_order1)'
     933            1 :       x = 1d0
     934            1 :       x%d1val1 = 1d0
     935            1 :       x = log(x)
     936            1 :       call should_print2('', 0d0, 1d0, 0d0, x)
     937              : 
     938            1 :       write (*, *) 'Testing safe_log(auto_diff_real_2var_order1)'
     939            1 :       x = 1d0
     940            1 :       x%d1val1 = 1d0
     941            1 :       x = log(x)
     942            1 :       call should_print2('', 0d0, 1d0, 0d0, x)
     943              : 
     944            1 :       write (*, *) 'Testing log10(auto_diff_real_2var_order1)'
     945            1 :       x = 1d1
     946            1 :       x%d1val1 = 1d0
     947            1 :       x = log10(x)
     948            1 :       call should_print2('', 1d0, 1d0/(10*ln10), 0d0, x)
     949              : 
     950            1 :       write (*, *) 'Testing safe_log10(auto_diff_real_2var_order1)'
     951            1 :       x = 1d1
     952            1 :       x%d1val1 = 1d0
     953            1 :       x = safe_log10(x)
     954            1 :       call should_print2('', 1d0, 1d0/(10*ln10), 0d0, x)
     955              : 
     956            1 :       write (*, *) 'Testing log(auto_diff_real_2var_order1)'
     957            1 :       x = exp(1d0)
     958            1 :       x%d1val1 = 1d0
     959            1 :       x = log(x)
     960            1 :       call should_print2('', 1d0, exp(-1d0), 0d0, x)
     961              : 
     962            1 :       write (*, *) 'Testing safe_log(auto_diff_real_2var_order1)'
     963            1 :       x = exp(1d0)
     964            1 :       x%d1val1 = 1d0
     965            1 :       x = log(x)
     966            1 :       call should_print2(' approximately', 1d0, exp(-1d0), 0d0, x)
     967              : 
     968            1 :       write (*, *) 'Testing log10(auto_diff_real_2var_order1)'
     969            1 :       x = 1d2
     970            1 :       x%d1val1 = 1d0
     971            1 :       x = log10(x)
     972            1 :       call should_print2(' approximately', 2d0, 1d0/(100*ln10), 0d0, x)
     973              : 
     974            1 :       write (*, *) 'Testing safe_log10(auto_diff_real_2var_order1)'
     975            1 :       x = 1d2
     976            1 :       x%d1val1 = 1d0
     977            1 :       x = log10(x)
     978            1 :       call should_print2(' approximately', 2d0, 1d0/(100*ln10), 0d0, x)
     979              : 
     980            1 :       write (*, *) 'Testing pow2(auto_diff_real_2var_order1)'
     981            1 :       x = 3d0
     982            1 :       x%d1val1 = 1d0
     983            1 :       x = pow2(x)
     984            1 :       call should_print2(' approximately', 9d0, 6d0, 0d0, x)
     985              : 
     986            1 :       write (*, *) 'Testing pow3(auto_diff_real_2var_order1)'
     987            1 :       x = 2d0
     988            1 :       x%d1val1 = 1d0
     989            1 :       x = pow3(x)
     990            1 :       call should_print2('', 8d0, 3*4d0, 0d0, x)
     991              : 
     992            1 :       write (*, *) 'Testing pow4(auto_diff_real_2var_order1)'
     993            1 :       x = 2d0
     994            1 :       x%d1val1 = 1d0
     995            1 :       x = pow4(x)
     996            1 :       call should_print2('', 16d0, 4*8d0, 0d0, x)
     997              : 
     998            1 :       write (*, *) 'Testing pow5(auto_diff_real_2var_order1)'
     999            1 :       x = 3d0
    1000            1 :       x%d1val1 = 1d0
    1001            1 :       x = pow5(x)
    1002            1 :       call should_print2('', 243d0, 405d0, 0d0, x)
    1003              : 
    1004            1 :       write (*, *) 'Testing pow6(auto_diff_real_2var_order1)'
    1005            1 :       x = 2d0
    1006            1 :       x%d1val1 = 1d0
    1007            1 :       x = pow6(x)
    1008            1 :       call should_print2('', 64d0, 6*32d0, 0d0, x)
    1009              : 
    1010            1 :       write (*, *) 'Testing pow7(auto_diff_real_2var_order1)'
    1011            1 :       x = 2d0
    1012            1 :       x%d1val1 = 1d0
    1013            1 :       x = pow7(x)
    1014            1 :       call should_print2('', 128d0, 7*64d0, 0d0, x)
    1015              : 
    1016            1 :       write (*, *) 'Testing pow(auto_diff_real_2var_order1, real(dp))'
    1017            1 :       x = 4d0
    1018            1 :       x%d1val1 = 1d0
    1019            1 :       x = pow(x, 0.5d0)
    1020            1 :       call should_print2(' approximately', 2d0, 0.25d0, 0d0, x)
    1021              : 
    1022            1 :       write (*, *) 'Testing pow(real(dp), auto_diff_real_2var_order1)'
    1023            1 :       x = 2d0
    1024            1 :       x%d1val1 = 1d0
    1025            1 :       x = pow(exp(1d0), x)
    1026            1 :       call should_print2(' approximately', exp(2d0), exp(2d0), 0d0, x)
    1027              : 
    1028            1 :       write (*, *) 'Testing pow(auto_diff_real_2var_order1, integer)'
    1029            1 :       x = 4d0
    1030            1 :       x%d1val1 = 1d0
    1031            1 :       x = pow(x, 2d0)
    1032            1 :       call should_print2('', 16d0, 8d0, 0d0, x)
    1033              : 
    1034            1 :       write (*, *) 'Testing pow(integer, auto_diff_real_2var_order1)'
    1035            1 :       x = 2d0
    1036            1 :       x%d1val1 = 1d0
    1037            1 :       x = pow(2d0, x)
    1038            1 :       call should_print2('', 4d0, 4d0*log(2d0), 0d0, x)
    1039              : 
    1040            1 :    end subroutine do_test_auto_diff_2var_order1
    1041              : 
    1042              : end program test_auto_diff
        

Generated by: LCOV version 2.0-1