LCOV - code coverage report
Current view: top level - auto_diff/private - auto_diff_real_2var_order3_module.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 36.3 % 2482 902
Test Date: 2025-05-08 18:23:42 Functions: 33.9 % 118 40

            Line data    Source code
       1              : ! ***********************************************************************
       2              : !
       3              : !   Copyright (C) 2022  The MESA Team
       4              : !
       5              : !   This program is free software: you can redistribute it and/or modify
       6              : !   it under the terms of the GNU Lesser General Public License
       7              : !   as published by the Free Software Foundation,
       8              : !   either version 3 of the License, or (at your option) any later version.
       9              : !
      10              : !   This program is distributed in the hope that it will be useful,
      11              : !   but WITHOUT ANY WARRANTY; without even the implied warranty of
      12              : !   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
      13              : !   See the GNU Lesser General Public License for more details.
      14              : !
      15              : !   You should have received a copy of the GNU Lesser General Public License
      16              : !   along with this program. If not, see <https://www.gnu.org/licenses/>.
      17              : !
      18              : ! ***********************************************************************
      19              : 
      20              : module auto_diff_real_2var_order3_module
      21              :       use const_def, only: dp, ln10, pi
      22              :       use utils_lib
      23              :       use support_functions
      24              :       use math_lib
      25              : 
      26              :       implicit none
      27              :       private
      28              :    public :: auto_diff_real_2var_order3, &
      29              :       assignment(=), &
      30              :       operator(.eq.), &
      31              :       operator(.ne.), &
      32              :       operator(.gt.), &
      33              :       operator(.lt.), &
      34              :       operator(.le.), &
      35              :       operator(.ge.), &
      36              :       make_unop, &
      37              :       make_binop, &
      38              :       sign, &
      39              :       safe_sqrt, &
      40              :       operator(-), &
      41              :       exp, &
      42              :       expm1, &
      43              :       exp10, &
      44              :       powm1, &
      45              :       log, &
      46              :       log1p, &
      47              :       safe_log, &
      48              :       log10, &
      49              :       safe_log10, &
      50              :       log2, &
      51              :       sin, &
      52              :       cos, &
      53              :       tan, &
      54              :       sinpi, &
      55              :       cospi, &
      56              :       tanpi, &
      57              :       sinh, &
      58              :       cosh, &
      59              :       tanh, &
      60              :       asin, &
      61              :       acos, &
      62              :       atan, &
      63              :       asinpi, &
      64              :       acospi, &
      65              :       atanpi, &
      66              :       asinh, &
      67              :       acosh, &
      68              :       atanh, &
      69              :       sqrt, &
      70              :       pow2, &
      71              :       pow3, &
      72              :       pow4, &
      73              :       pow5, &
      74              :       pow6, &
      75              :       pow7, &
      76              :       pow8, &
      77              :       abs, &
      78              :       operator(+), &
      79              :       operator(*), &
      80              :       operator(/), &
      81              :       pow, &
      82              :       max, &
      83              :       min, &
      84              :       dim, &
      85              :       differentiate_1, &
      86              :       differentiate_2
      87              :    type :: auto_diff_real_2var_order3
      88              :       real(dp) :: val
      89              :       real(dp) :: d1val1
      90              :       real(dp) :: d1val2
      91              :       real(dp) :: d2val1
      92              :       real(dp) :: d1val1_d1val2
      93              :       real(dp) :: d2val2
      94              :       real(dp) :: d3val1
      95              :       real(dp) :: d2val1_d1val2
      96              :       real(dp) :: d1val1_d2val2
      97              :       real(dp) :: d3val2
      98              :    end type auto_diff_real_2var_order3
      99              : 
     100              :    interface assignment(=)
     101              :       module procedure assign_from_self
     102              :       module procedure assign_from_real_dp
     103              :       module procedure assign_from_int
     104              :    end interface assignment(=)
     105              : 
     106              :    interface operator(.eq.)
     107              :       module procedure equal_self
     108              :       module procedure equal_auto_diff_real_2var_order3_real_dp
     109              :       module procedure equal_real_dp_auto_diff_real_2var_order3
     110              :       module procedure equal_auto_diff_real_2var_order3_int
     111              :       module procedure equal_int_auto_diff_real_2var_order3
     112              :    end interface operator(.eq.)
     113              : 
     114              :    interface operator(.ne.)
     115              :       module procedure neq_self
     116              :       module procedure neq_auto_diff_real_2var_order3_real_dp
     117              :       module procedure neq_real_dp_auto_diff_real_2var_order3
     118              :       module procedure neq_auto_diff_real_2var_order3_int
     119              :       module procedure neq_int_auto_diff_real_2var_order3
     120              :    end interface operator(.ne.)
     121              : 
     122              :    interface operator(.gt.)
     123              :       module procedure greater_self
     124              :       module procedure greater_auto_diff_real_2var_order3_real_dp
     125              :       module procedure greater_real_dp_auto_diff_real_2var_order3
     126              :       module procedure greater_auto_diff_real_2var_order3_int
     127              :       module procedure greater_int_auto_diff_real_2var_order3
     128              :    end interface operator(.gt.)
     129              : 
     130              :    interface operator(.lt.)
     131              :       module procedure less_self
     132              :       module procedure less_auto_diff_real_2var_order3_real_dp
     133              :       module procedure less_real_dp_auto_diff_real_2var_order3
     134              :       module procedure less_auto_diff_real_2var_order3_int
     135              :       module procedure less_int_auto_diff_real_2var_order3
     136              :    end interface operator(.lt.)
     137              : 
     138              :    interface operator(.le.)
     139              :       module procedure leq_self
     140              :       module procedure leq_auto_diff_real_2var_order3_real_dp
     141              :       module procedure leq_real_dp_auto_diff_real_2var_order3
     142              :       module procedure leq_auto_diff_real_2var_order3_int
     143              :       module procedure leq_int_auto_diff_real_2var_order3
     144              :    end interface operator(.le.)
     145              : 
     146              :    interface operator(.ge.)
     147              :       module procedure geq_self
     148              :       module procedure geq_auto_diff_real_2var_order3_real_dp
     149              :       module procedure geq_real_dp_auto_diff_real_2var_order3
     150              :       module procedure geq_auto_diff_real_2var_order3_int
     151              :       module procedure geq_int_auto_diff_real_2var_order3
     152              :    end interface operator(.ge.)
     153              : 
     154              :    interface make_unop
     155              :       module procedure make_unary_operator
     156              :    end interface make_unop
     157              : 
     158              :    interface make_binop
     159              :       module procedure make_binary_operator
     160              :    end interface make_binop
     161              : 
     162              :    interface sign
     163              :       module procedure sign_self
     164              :    end interface sign
     165              : 
     166              :    interface safe_sqrt
     167              :       module procedure safe_sqrt_self
     168              :    end interface safe_sqrt
     169              : 
     170              :    interface operator(-)
     171              :       module procedure unary_minus_self
     172              :    end interface operator(-)
     173              : 
     174              :    interface exp
     175              :       module procedure exp_self
     176              :    end interface exp
     177              : 
     178              :    interface expm1
     179              :       module procedure expm1_self
     180              :    end interface expm1
     181              : 
     182              :    interface exp10
     183              :       module procedure exp10_self
     184              :    end interface exp10
     185              : 
     186              :    interface powm1
     187              :       module procedure powm1_self
     188              :    end interface powm1
     189              : 
     190              :    interface log
     191              :       module procedure log_self
     192              :    end interface log
     193              : 
     194              :    interface log1p
     195              :       module procedure log1p_self
     196              :    end interface log1p
     197              : 
     198              :    interface safe_log
     199              :       module procedure safe_log_self
     200              :    end interface safe_log
     201              : 
     202              :    interface log10
     203              :       module procedure log10_self
     204              :    end interface log10
     205              : 
     206              :    interface safe_log10
     207              :       module procedure safe_log10_self
     208              :    end interface safe_log10
     209              : 
     210              :    interface log2
     211              :       module procedure log2_self
     212              :    end interface log2
     213              : 
     214              :    interface sin
     215              :       module procedure sin_self
     216              :    end interface sin
     217              : 
     218              :    interface cos
     219              :       module procedure cos_self
     220              :    end interface cos
     221              : 
     222              :    interface tan
     223              :       module procedure tan_self
     224              :    end interface tan
     225              : 
     226              :    interface sinpi
     227              :       module procedure sinpi_self
     228              :    end interface sinpi
     229              : 
     230              :    interface cospi
     231              :       module procedure cospi_self
     232              :    end interface cospi
     233              : 
     234              :    interface tanpi
     235              :       module procedure tanpi_self
     236              :    end interface tanpi
     237              : 
     238              :    interface sinh
     239              :       module procedure sinh_self
     240              :    end interface sinh
     241              : 
     242              :    interface cosh
     243              :       module procedure cosh_self
     244              :    end interface cosh
     245              : 
     246              :    interface tanh
     247              :       module procedure tanh_self
     248              :    end interface tanh
     249              : 
     250              :    interface asin
     251              :       module procedure asin_self
     252              :    end interface asin
     253              : 
     254              :    interface acos
     255              :       module procedure acos_self
     256              :    end interface acos
     257              : 
     258              :    interface atan
     259              :       module procedure atan_self
     260              :    end interface atan
     261              : 
     262              :    interface asinpi
     263              :       module procedure asinpi_self
     264              :    end interface asinpi
     265              : 
     266              :    interface acospi
     267              :       module procedure acospi_self
     268              :    end interface acospi
     269              : 
     270              :    interface atanpi
     271              :       module procedure atanpi_self
     272              :    end interface atanpi
     273              : 
     274              :    interface asinh
     275              :       module procedure asinh_self
     276              :    end interface asinh
     277              : 
     278              :    interface acosh
     279              :       module procedure acosh_self
     280              :    end interface acosh
     281              : 
     282              :    interface atanh
     283              :       module procedure atanh_self
     284              :    end interface atanh
     285              : 
     286              :    interface sqrt
     287              :       module procedure sqrt_self
     288              :    end interface sqrt
     289              : 
     290              :    interface pow2
     291              :       module procedure pow2_self
     292              :    end interface pow2
     293              : 
     294              :    interface pow3
     295              :       module procedure pow3_self
     296              :    end interface pow3
     297              : 
     298              :    interface pow4
     299              :       module procedure pow4_self
     300              :    end interface pow4
     301              : 
     302              :    interface pow5
     303              :       module procedure pow5_self
     304              :    end interface pow5
     305              : 
     306              :    interface pow6
     307              :       module procedure pow6_self
     308              :    end interface pow6
     309              : 
     310              :    interface pow7
     311              :       module procedure pow7_self
     312              :    end interface pow7
     313              : 
     314              :    interface pow8
     315              :       module procedure pow8_self
     316              :    end interface pow8
     317              : 
     318              :    interface abs
     319              :       module procedure abs_self
     320              :    end interface abs
     321              : 
     322              :    interface operator(+)
     323              :       module procedure add_self
     324              :       module procedure add_self_real
     325              :       module procedure add_real_self
     326              :       module procedure add_self_int
     327              :       module procedure add_int_self
     328              :    end interface operator(+)
     329              : 
     330              :    interface operator(-)
     331              :       module procedure sub_self
     332              :       module procedure sub_self_real
     333              :       module procedure sub_real_self
     334              :       module procedure sub_self_int
     335              :       module procedure sub_int_self
     336              :    end interface operator(-)
     337              : 
     338              :    interface operator(*)
     339              :       module procedure mul_self
     340              :       module procedure mul_self_real
     341              :       module procedure mul_real_self
     342              :       module procedure mul_self_int
     343              :       module procedure mul_int_self
     344              :    end interface operator(*)
     345              : 
     346              :    interface operator(/)
     347              :       module procedure div_self
     348              :       module procedure div_self_real
     349              :       module procedure div_real_self
     350              :       module procedure div_self_int
     351              :       module procedure div_int_self
     352              :    end interface operator(/)
     353              : 
     354              :    interface pow
     355              :       module procedure pow_self
     356              :       module procedure pow_self_real
     357              :       module procedure pow_real_self
     358              :       module procedure pow_self_int
     359              :       module procedure pow_int_self
     360              :    end interface pow
     361              : 
     362              :    interface max
     363              :       module procedure max_self
     364              :       module procedure max_self_real
     365              :       module procedure max_real_self
     366              :       module procedure max_self_int
     367              :       module procedure max_int_self
     368              :    end interface max
     369              : 
     370              :    interface min
     371              :       module procedure min_self
     372              :       module procedure min_self_real
     373              :       module procedure min_real_self
     374              :       module procedure min_self_int
     375              :       module procedure min_int_self
     376              :    end interface min
     377              : 
     378              :    interface dim
     379              :       module procedure dim_self
     380              :       module procedure dim_self_real
     381              :       module procedure dim_real_self
     382              :       module procedure dim_self_int
     383              :       module procedure dim_int_self
     384              :    end interface dim
     385              : 
     386              :    interface differentiate_1
     387              :       module procedure differentiate_auto_diff_real_2var_order3_1
     388              :    end interface differentiate_1
     389              : 
     390              :    interface differentiate_2
     391              :       module procedure differentiate_auto_diff_real_2var_order3_2
     392              :    end interface differentiate_2
     393              : 
     394              :    contains
     395              : 
     396     32303190 :    subroutine assign_from_self(this, other)
     397              :       type(auto_diff_real_2var_order3), intent(out) :: this
     398              :       type(auto_diff_real_2var_order3), intent(in) :: other
     399     32303190 :       this%val = other%val
     400     32303190 :       this%d1val1 = other%d1val1
     401     32303190 :       this%d1val2 = other%d1val2
     402     32303190 :       this%d2val1 = other%d2val1
     403     32303190 :       this%d1val1_d1val2 = other%d1val1_d1val2
     404     32303190 :       this%d2val2 = other%d2val2
     405     32303190 :       this%d3val1 = other%d3val1
     406     32303190 :       this%d2val1_d1val2 = other%d2val1_d1val2
     407     32303190 :       this%d1val1_d2val2 = other%d1val1_d2val2
     408     32303190 :       this%d3val2 = other%d3val2
     409     32303190 :    end subroutine assign_from_self
     410              : 
     411      1442040 :    subroutine assign_from_real_dp(this, other)
     412              :       type(auto_diff_real_2var_order3), intent(out) :: this
     413              :       real(dp), intent(in) :: other
     414      1442040 :       this%val = other
     415      1442040 :       this%d1val1 = 0.0_dp
     416      1442040 :       this%d1val2 = 0.0_dp
     417      1442040 :       this%d2val1 = 0.0_dp
     418      1442040 :       this%d1val1_d1val2 = 0.0_dp
     419      1442040 :       this%d2val2 = 0.0_dp
     420      1442040 :       this%d3val1 = 0.0_dp
     421      1442040 :       this%d2val1_d1val2 = 0.0_dp
     422      1442040 :       this%d1val1_d2val2 = 0.0_dp
     423      1442040 :       this%d3val2 = 0.0_dp
     424      1442040 :    end subroutine assign_from_real_dp
     425              : 
     426            0 :    subroutine assign_from_int(this, other)
     427              :       type(auto_diff_real_2var_order3), intent(out) :: this
     428              :       integer, intent(in) :: other
     429            0 :       this%val = other
     430            0 :       this%d1val1 = 0.0_dp
     431            0 :       this%d1val2 = 0.0_dp
     432            0 :       this%d2val1 = 0.0_dp
     433            0 :       this%d1val1_d1val2 = 0.0_dp
     434            0 :       this%d2val2 = 0.0_dp
     435            0 :       this%d3val1 = 0.0_dp
     436            0 :       this%d2val1_d1val2 = 0.0_dp
     437            0 :       this%d1val1_d2val2 = 0.0_dp
     438            0 :       this%d3val2 = 0.0_dp
     439            0 :    end subroutine assign_from_int
     440              : 
     441            0 :    function equal_self(this, other) result(z)
     442              :       type(auto_diff_real_2var_order3), intent(in) :: this
     443              :       type(auto_diff_real_2var_order3), intent(in) :: other
     444              :       logical :: z
     445            0 :       z = (this%val == other%val)
     446            0 :    end function equal_self
     447              : 
     448            0 :    function equal_auto_diff_real_2var_order3_real_dp(this, other) result(z)
     449              :       type(auto_diff_real_2var_order3), intent(in) :: this
     450              :       real(dp), intent(in) :: other
     451              :       logical :: z
     452            0 :       z = (this%val == other)
     453            0 :    end function equal_auto_diff_real_2var_order3_real_dp
     454              : 
     455            0 :    function equal_real_dp_auto_diff_real_2var_order3(this, other) result(z)
     456              :       real(dp), intent(in) :: this
     457              :       type(auto_diff_real_2var_order3), intent(in) :: other
     458              :       logical :: z
     459            0 :       z = (this == other%val)
     460            0 :    end function equal_real_dp_auto_diff_real_2var_order3
     461              : 
     462            0 :    function equal_auto_diff_real_2var_order3_int(this, other) result(z)
     463              :       type(auto_diff_real_2var_order3), intent(in) :: this
     464              :       integer, intent(in) :: other
     465              :       logical :: z
     466            0 :       z = (this%val == other)
     467            0 :    end function equal_auto_diff_real_2var_order3_int
     468              : 
     469            0 :    function equal_int_auto_diff_real_2var_order3(this, other) result(z)
     470              :       integer, intent(in) :: this
     471              :       type(auto_diff_real_2var_order3), intent(in) :: other
     472              :       logical :: z
     473            0 :       z = (this == other%val)
     474            0 :    end function equal_int_auto_diff_real_2var_order3
     475              : 
     476            0 :    function neq_self(this, other) result(z)
     477              :       type(auto_diff_real_2var_order3), intent(in) :: this
     478              :       type(auto_diff_real_2var_order3), intent(in) :: other
     479              :       logical :: z
     480            0 :       z = (this%val /= other%val)
     481            0 :    end function neq_self
     482              : 
     483            0 :    function neq_auto_diff_real_2var_order3_real_dp(this, other) result(z)
     484              :       type(auto_diff_real_2var_order3), intent(in) :: this
     485              :       real(dp), intent(in) :: other
     486              :       logical :: z
     487            0 :       z = (this%val /= other)
     488            0 :    end function neq_auto_diff_real_2var_order3_real_dp
     489              : 
     490            0 :    function neq_real_dp_auto_diff_real_2var_order3(this, other) result(z)
     491              :       real(dp), intent(in) :: this
     492              :       type(auto_diff_real_2var_order3), intent(in) :: other
     493              :       logical :: z
     494            0 :       z = (this /= other%val)
     495            0 :    end function neq_real_dp_auto_diff_real_2var_order3
     496              : 
     497            0 :    function neq_auto_diff_real_2var_order3_int(this, other) result(z)
     498              :       type(auto_diff_real_2var_order3), intent(in) :: this
     499              :       integer, intent(in) :: other
     500              :       logical :: z
     501            0 :       z = (this%val /= other)
     502            0 :    end function neq_auto_diff_real_2var_order3_int
     503              : 
     504            0 :    function neq_int_auto_diff_real_2var_order3(this, other) result(z)
     505              :       integer, intent(in) :: this
     506              :       type(auto_diff_real_2var_order3), intent(in) :: other
     507              :       logical :: z
     508            0 :       z = (this /= other%val)
     509            0 :    end function neq_int_auto_diff_real_2var_order3
     510              : 
     511            0 :    function greater_self(this, other) result(z)
     512              :       type(auto_diff_real_2var_order3), intent(in) :: this
     513              :       type(auto_diff_real_2var_order3), intent(in) :: other
     514              :       logical :: z
     515            0 :       z = (this%val > other%val)
     516            0 :    end function greater_self
     517              : 
     518       667348 :    function greater_auto_diff_real_2var_order3_real_dp(this, other) result(z)
     519              :       type(auto_diff_real_2var_order3), intent(in) :: this
     520              :       real(dp), intent(in) :: other
     521              :       logical :: z
     522       667348 :       z = (this%val > other)
     523       667348 :    end function greater_auto_diff_real_2var_order3_real_dp
     524              : 
     525            0 :    function greater_real_dp_auto_diff_real_2var_order3(this, other) result(z)
     526              :       real(dp), intent(in) :: this
     527              :       type(auto_diff_real_2var_order3), intent(in) :: other
     528              :       logical :: z
     529            0 :       z = (this > other%val)
     530            0 :    end function greater_real_dp_auto_diff_real_2var_order3
     531              : 
     532            0 :    function greater_auto_diff_real_2var_order3_int(this, other) result(z)
     533              :       type(auto_diff_real_2var_order3), intent(in) :: this
     534              :       integer, intent(in) :: other
     535              :       logical :: z
     536            0 :       z = (this%val > other)
     537            0 :    end function greater_auto_diff_real_2var_order3_int
     538              : 
     539            0 :    function greater_int_auto_diff_real_2var_order3(this, other) result(z)
     540              :       integer, intent(in) :: this
     541              :       type(auto_diff_real_2var_order3), intent(in) :: other
     542              :       logical :: z
     543            0 :       z = (this > other%val)
     544            0 :    end function greater_int_auto_diff_real_2var_order3
     545              : 
     546        45520 :    function less_self(this, other) result(z)
     547              :       type(auto_diff_real_2var_order3), intent(in) :: this
     548              :       type(auto_diff_real_2var_order3), intent(in) :: other
     549              :       logical :: z
     550        45520 :       z = (this%val < other%val)
     551        45520 :    end function less_self
     552              : 
     553       712868 :    function less_auto_diff_real_2var_order3_real_dp(this, other) result(z)
     554              :       type(auto_diff_real_2var_order3), intent(in) :: this
     555              :       real(dp), intent(in) :: other
     556              :       logical :: z
     557       712868 :       z = (this%val < other)
     558       712868 :    end function less_auto_diff_real_2var_order3_real_dp
     559              : 
     560            0 :    function less_real_dp_auto_diff_real_2var_order3(this, other) result(z)
     561              :       real(dp), intent(in) :: this
     562              :       type(auto_diff_real_2var_order3), intent(in) :: other
     563              :       logical :: z
     564            0 :       z = (this < other%val)
     565            0 :    end function less_real_dp_auto_diff_real_2var_order3
     566              : 
     567       136560 :    function less_auto_diff_real_2var_order3_int(this, other) result(z)
     568              :       type(auto_diff_real_2var_order3), intent(in) :: this
     569              :       integer, intent(in) :: other
     570              :       logical :: z
     571       136560 :       z = (this%val < other)
     572       136560 :    end function less_auto_diff_real_2var_order3_int
     573              : 
     574            0 :    function less_int_auto_diff_real_2var_order3(this, other) result(z)
     575              :       integer, intent(in) :: this
     576              :       type(auto_diff_real_2var_order3), intent(in) :: other
     577              :       logical :: z
     578            0 :       z = (this < other%val)
     579            0 :    end function less_int_auto_diff_real_2var_order3
     580              : 
     581            0 :    function leq_self(this, other) result(z)
     582              :       type(auto_diff_real_2var_order3), intent(in) :: this
     583              :       type(auto_diff_real_2var_order3), intent(in) :: other
     584              :       logical :: z
     585            0 :       z = (this%val <= other%val)
     586            0 :    end function leq_self
     587              : 
     588            0 :    function leq_auto_diff_real_2var_order3_real_dp(this, other) result(z)
     589              :       type(auto_diff_real_2var_order3), intent(in) :: this
     590              :       real(dp), intent(in) :: other
     591              :       logical :: z
     592            0 :       z = (this%val <= other)
     593            0 :    end function leq_auto_diff_real_2var_order3_real_dp
     594              : 
     595            0 :    function leq_real_dp_auto_diff_real_2var_order3(this, other) result(z)
     596              :       real(dp), intent(in) :: this
     597              :       type(auto_diff_real_2var_order3), intent(in) :: other
     598              :       logical :: z
     599            0 :       z = (this <= other%val)
     600            0 :    end function leq_real_dp_auto_diff_real_2var_order3
     601              : 
     602            0 :    function leq_auto_diff_real_2var_order3_int(this, other) result(z)
     603              :       type(auto_diff_real_2var_order3), intent(in) :: this
     604              :       integer, intent(in) :: other
     605              :       logical :: z
     606            0 :       z = (this%val <= other)
     607            0 :    end function leq_auto_diff_real_2var_order3_int
     608              : 
     609            0 :    function leq_int_auto_diff_real_2var_order3(this, other) result(z)
     610              :       integer, intent(in) :: this
     611              :       type(auto_diff_real_2var_order3), intent(in) :: other
     612              :       logical :: z
     613            0 :       z = (this <= other%val)
     614            0 :    end function leq_int_auto_diff_real_2var_order3
     615              : 
     616            0 :    function geq_self(this, other) result(z)
     617              :       type(auto_diff_real_2var_order3), intent(in) :: this
     618              :       type(auto_diff_real_2var_order3), intent(in) :: other
     619              :       logical :: z
     620            0 :       z = (this%val >= other%val)
     621            0 :    end function geq_self
     622              : 
     623            0 :    function geq_auto_diff_real_2var_order3_real_dp(this, other) result(z)
     624              :       type(auto_diff_real_2var_order3), intent(in) :: this
     625              :       real(dp), intent(in) :: other
     626              :       logical :: z
     627            0 :       z = (this%val >= other)
     628            0 :    end function geq_auto_diff_real_2var_order3_real_dp
     629              : 
     630            0 :    function geq_real_dp_auto_diff_real_2var_order3(this, other) result(z)
     631              :       real(dp), intent(in) :: this
     632              :       type(auto_diff_real_2var_order3), intent(in) :: other
     633              :       logical :: z
     634            0 :       z = (this >= other%val)
     635            0 :    end function geq_real_dp_auto_diff_real_2var_order3
     636              : 
     637            0 :    function geq_auto_diff_real_2var_order3_int(this, other) result(z)
     638              :       type(auto_diff_real_2var_order3), intent(in) :: this
     639              :       integer, intent(in) :: other
     640              :       logical :: z
     641            0 :       z = (this%val >= other)
     642            0 :    end function geq_auto_diff_real_2var_order3_int
     643              : 
     644            0 :    function geq_int_auto_diff_real_2var_order3(this, other) result(z)
     645              :       integer, intent(in) :: this
     646              :       type(auto_diff_real_2var_order3), intent(in) :: other
     647              :       logical :: z
     648            0 :       z = (this >= other%val)
     649            0 :    end function geq_int_auto_diff_real_2var_order3
     650              : 
     651            0 :    function make_unary_operator(x, z_val, z_d1x, z_d2x, z_d3x) result(unary)
     652              :       type(auto_diff_real_2var_order3), intent(in) :: x
     653              :       real(dp), intent(in) :: z_val
     654              :       real(dp), intent(in) :: z_d1x
     655              :       real(dp), intent(in) :: z_d2x
     656              :       real(dp), intent(in) :: z_d3x
     657              :       type(auto_diff_real_2var_order3) :: unary
     658            0 :       real(dp) :: q4
     659            0 :       real(dp) :: q3
     660            0 :       real(dp) :: q2
     661            0 :       real(dp) :: q1
     662            0 :       real(dp) :: q0
     663            0 :       q0 = pow2(x%d1val1)
     664            0 :       q1 = x%d1val2*z_d2x
     665            0 :       q2 = pow2(x%d1val2)
     666            0 :       q3 = x%d1val1*z_d2x
     667            0 :       q4 = 2.0_dp*x%d1val1_d1val2
     668            0 :       unary%val = z_val
     669            0 :       unary%d1val1 = x%d1val1*z_d1x
     670            0 :       unary%d1val2 = x%d1val2*z_d1x
     671            0 :       unary%d2val1 = q0*z_d2x + x%d2val1*z_d1x
     672            0 :       unary%d1val1_d1val2 = q1*x%d1val1 + x%d1val1_d1val2*z_d1x
     673            0 :       unary%d2val2 = q2*z_d2x + x%d2val2*z_d1x
     674            0 :       unary%d3val1 = 3.0_dp*q3*x%d2val1 + x%d3val1*z_d1x + z_d3x*pow3(x%d1val1)
     675            0 :       unary%d2val1_d1val2 = q0*x%d1val2*z_d3x + q1*x%d2val1 + q3*q4 + x%d2val1_d1val2*z_d1x
     676            0 :       unary%d1val1_d2val2 = q1*q4 + q2*x%d1val1*z_d3x + q3*x%d2val2 + x%d1val1_d2val2*z_d1x
     677            0 :       unary%d3val2 = 3.0_dp*q1*x%d2val2 + x%d3val2*z_d1x + z_d3x*pow3(x%d1val2)
     678            0 :    end function make_unary_operator
     679              : 
     680       621828 :    function make_binary_operator(x, y, z_val, &
     681              :                                  z_d1x, z_d1y, z_d2x, z_d1x_d1y, z_d2y, z_d3x, z_d2x_d1y, z_d1x_d2y, z_d3y) &
     682              :                                  result(binary)
     683              :       type(auto_diff_real_2var_order3), intent(in) :: x
     684              :       type(auto_diff_real_2var_order3), intent(in) :: y
     685              :       real(dp), intent(in) :: z_val
     686              :       real(dp), intent(in) :: z_d1x
     687              :       real(dp), intent(in) :: z_d1y
     688              :       real(dp), intent(in) :: z_d2x
     689              :       real(dp), intent(in) :: z_d1x_d1y
     690              :       real(dp), intent(in) :: z_d2y
     691              :       real(dp), intent(in) :: z_d3x
     692              :       real(dp), intent(in) :: z_d2x_d1y
     693              :       real(dp), intent(in) :: z_d1x_d2y
     694              :       real(dp), intent(in) :: z_d3y
     695              :       type(auto_diff_real_2var_order3) :: binary
     696       621828 :       real(dp) :: q26
     697       621828 :       real(dp) :: q25
     698       621828 :       real(dp) :: q24
     699       621828 :       real(dp) :: q23
     700       621828 :       real(dp) :: q22
     701       621828 :       real(dp) :: q21
     702       621828 :       real(dp) :: q20
     703       621828 :       real(dp) :: q19
     704       621828 :       real(dp) :: q18
     705       621828 :       real(dp) :: q17
     706       621828 :       real(dp) :: q16
     707       621828 :       real(dp) :: q15
     708       621828 :       real(dp) :: q14
     709       621828 :       real(dp) :: q13
     710       621828 :       real(dp) :: q12
     711       621828 :       real(dp) :: q11
     712       621828 :       real(dp) :: q10
     713       621828 :       real(dp) :: q9
     714       621828 :       real(dp) :: q8
     715       621828 :       real(dp) :: q7
     716       621828 :       real(dp) :: q6
     717       621828 :       real(dp) :: q5
     718       621828 :       real(dp) :: q4
     719       621828 :       real(dp) :: q3
     720       621828 :       real(dp) :: q2
     721       621828 :       real(dp) :: q1
     722       621828 :       real(dp) :: q0
     723       621828 :       q0 = pow2(x%d1val1)
     724       621828 :       q1 = pow2(y%d1val1)
     725       621828 :       q2 = x%d1val1*z_d1x_d1y
     726       621828 :       q3 = 2.0_dp*q2
     727       621828 :       q4 = x%d1val2*z_d2x
     728       621828 :       q5 = y%d1val2*z_d1x_d1y
     729       621828 :       q6 = x%d1val2*z_d1x_d1y
     730       621828 :       q7 = y%d1val2*z_d2y
     731       621828 :       q8 = pow2(x%d1val2)
     732       621828 :       q9 = pow2(y%d1val2)
     733       621828 :       q10 = 2.0_dp*q5
     734       621828 :       q11 = x%d1val1*z_d2x
     735       621828 :       q12 = 3.0_dp*x%d2val1
     736       621828 :       q13 = 3.0_dp*y%d2val1
     737       621828 :       q14 = y%d1val1*z_d1x_d1y
     738       621828 :       q15 = y%d1val1*z_d2y
     739       621828 :       q16 = q1*z_d1x_d2y
     740       621828 :       q17 = q0*z_d2x_d1y
     741       621828 :       q18 = 2.0_dp*x%d1val1_d1val2
     742       621828 :       q19 = 2.0_dp*y%d1val1_d1val2
     743       621828 :       q20 = 2.0_dp*x%d1val1*y%d1val1
     744       621828 :       q21 = x%d1val2*z_d2x_d1y
     745       621828 :       q22 = y%d1val2*z_d1x_d2y
     746       621828 :       q23 = q9*z_d1x_d2y
     747       621828 :       q24 = q8*z_d2x_d1y
     748       621828 :       q25 = 3.0_dp*x%d2val2
     749       621828 :       q26 = 3.0_dp*y%d2val2
     750       621828 :       binary%val = z_val
     751       621828 :       binary%d1val1 = x%d1val1*z_d1x + y%d1val1*z_d1y
     752       621828 :       binary%d1val2 = x%d1val2*z_d1x + y%d1val2*z_d1y
     753       621828 :       binary%d2val1 = q0*z_d2x + q1*z_d2y + q3*y%d1val1 + x%d2val1*z_d1x + y%d2val1*z_d1y
     754              :       binary%d1val1_d1val2 = q4*x%d1val1 + q5*x%d1val1 + q6*y%d1val1 + q7*y%d1val1 &
     755       621828 :                            + x%d1val1_d1val2*z_d1x + y%d1val1_d1val2*z_d1y
     756       621828 :       binary%d2val2 = q10*x%d1val2 + q8*z_d2x + q9*z_d2y + x%d2val2*z_d1x + y%d2val2*z_d1y
     757              :       binary%d3val1 = 3.0_dp*q16*x%d1val1 + 3.0_dp*q17*y%d1val1 + q11*q12 + q12*q14 + q13*q15 &
     758              :                       + q13*q2 + x%d3val1*z_d1x + y%d3val1*z_d1y + z_d3x*pow3(x%d1val1) &
     759       621828 :                       + z_d3y*pow3(y%d1val1)
     760              :       binary%d2val1_d1val2 = q0*x%d1val2*z_d3x + q1*y%d1val2*z_d3y + q11*q18 + q14*q18 + q15*q19 &
     761              :                            + q16*x%d1val2 + q17*y%d1val2 + q20*q21 + q20*q22 + q3*y%d1val1_d1val2 &
     762              :                            + q4*x%d2val1 + q5*x%d2val1 + q6*y%d2val1 + q7*y%d2val1 &
     763       621828 :                            + x%d2val1_d1val2*z_d1x + y%d2val1_d1val2*z_d1y
     764              :       binary%d1val1_d2val2 = 2.0_dp*q21*x%d1val1*y%d1val2 + 2.0_dp*q22*x%d1val2*y%d1val1 &
     765              :                              + q10*x%d1val1_d1val2 + q11*x%d2val2 + q14*x%d2val2 + q15*y%d2val2 &
     766              :                              + q18*q4 + q19*q6 + q19*q7 + q2*y%d2val2 + q23*x%d1val1 &
     767              :                              + q24*y%d1val1 + q8*x%d1val1*z_d3x + q9*y%d1val1*z_d3y &
     768       621828 :                              + x%d1val1_d2val2*z_d1x + y%d1val1_d2val2*z_d1y
     769              :       binary%d3val2 = 3.0_dp*q23*x%d1val2 + 3.0_dp*q24*y%d1val2 + q25*q4 + q25*q5 + q26*q6 &
     770              :                       + q26*q7 + x%d3val2*z_d1x + y%d3val2*z_d1y + z_d3x*pow3(x%d1val2) &
     771       621828 :                       + z_d3y*pow3(y%d1val2)
     772       621828 :    end function make_binary_operator
     773              : 
     774            0 :    function sign_self(x) result(unary)
     775              :       type(auto_diff_real_2var_order3), intent(in) :: x
     776              :       type(auto_diff_real_2var_order3) :: unary
     777            0 :       unary%val = sgn(x%val)
     778            0 :       unary%d1val1 = 0.0_dp
     779            0 :       unary%d1val2 = 0.0_dp
     780            0 :       unary%d2val1 = 0.0_dp
     781            0 :       unary%d1val1_d1val2 = 0.0_dp
     782            0 :       unary%d2val2 = 0.0_dp
     783            0 :       unary%d3val1 = 0.0_dp
     784            0 :       unary%d2val1_d1val2 = 0.0_dp
     785            0 :       unary%d1val1_d2val2 = 0.0_dp
     786            0 :       unary%d3val2 = 0.0_dp
     787            0 :    end function sign_self
     788              : 
     789            0 :    function safe_sqrt_self(x) result(unary)
     790              :       type(auto_diff_real_2var_order3), intent(in) :: x
     791              :       type(auto_diff_real_2var_order3) :: unary
     792            0 :       real(dp) :: q15
     793            0 :       real(dp) :: q14
     794            0 :       real(dp) :: q13
     795            0 :       real(dp) :: q12
     796            0 :       real(dp) :: q11
     797            0 :       real(dp) :: q10
     798            0 :       real(dp) :: q9
     799            0 :       real(dp) :: q8
     800              :       real(dp) :: q7
     801            0 :       real(dp) :: q6
     802            0 :       real(dp) :: q5
     803            0 :       real(dp) :: q4
     804            0 :       real(dp) :: q3
     805            0 :       real(dp) :: q2
     806            0 :       real(dp) :: q1
     807              :       real(dp) :: q0
     808            0 :       q0 = Heaviside(x%val)
     809            0 :       q1 = q0*x%val
     810            0 :       q2 = sqrt(q1)
     811            0 :       q3 = 0.5_dp*q2*powm1(x%val)
     812            0 :       q4 = 2.0_dp*x%val
     813            0 :       q5 = q4*x%d2val1
     814            0 :       q6 = pow2(x%d1val1)
     815            0 :       q7 = pow2(x%val)
     816            0 :       q8 = 0.25_dp*q2*powm1(q7)
     817            0 :       q9 = q4*x%d2val2
     818            0 :       q10 = pow2(x%d1val2)
     819            0 :       q11 = x%d1val1*x%val
     820            0 :       q12 = 4.0_dp*q7
     821            0 :       q13 = 0.125_dp*q2*powm1(pow3(x%val))
     822            0 :       q14 = 4.0_dp*x%d1val1_d1val2
     823            0 :       q15 = x%d1val2*x%val
     824            0 :       unary%val = q2
     825            0 :       unary%d1val1 = q3*x%d1val1
     826            0 :       unary%d1val2 = q3*x%d1val2
     827            0 :       unary%d2val1 = q8*(q5 - q6)
     828            0 :       unary%d1val1_d1val2 = q8*(q4*x%d1val1_d1val2 - x%d1val1*x%d1val2)
     829            0 :       unary%d2val2 = q8*(-q10 + q9)
     830            0 :       unary%d3val1 = q13*(-6.0_dp*q11*x%d2val1 + 3.0_dp*pow3(x%d1val1) + q12*x%d3val1)
     831              :       unary%d2val1_d1val2 = 0.125_dp*(3.0_dp*q6*x%d1val2 - q11*q14 + q12*x%d2val1_d1val2 - q5*x%d1val2) &
     832            0 :                             * pow3(sqrt(q1))*powm1(q0)*powm1(pow4(x%val))
     833            0 :       unary%d1val1_d2val2 = q13*(3.0_dp*q10*x%d1val1 + q12*x%d1val1_d2val2 - q14*q15 - q9*x%d1val1)
     834            0 :       unary%d3val2 = q13*(-6.0_dp*q15*x%d2val2 + 3.0_dp*pow3(x%d1val2) + q12*x%d3val2)
     835            0 :    end function safe_sqrt_self
     836              : 
     837      3382260 :    function unary_minus_self(x) result(unary)
     838              :       type(auto_diff_real_2var_order3), intent(in) :: x
     839              :       type(auto_diff_real_2var_order3) :: unary
     840      3382260 :       unary%val = -x%val
     841      3382260 :       unary%d1val1 = -x%d1val1
     842      3382260 :       unary%d1val2 = -x%d1val2
     843      3382260 :       unary%d2val1 = -x%d2val1
     844      3382260 :       unary%d1val1_d1val2 = -x%d1val1_d1val2
     845      3382260 :       unary%d2val2 = -x%d2val2
     846      3382260 :       unary%d3val1 = -x%d3val1
     847      3382260 :       unary%d2val1_d1val2 = -x%d2val1_d1val2
     848      3382260 :       unary%d1val1_d2val2 = -x%d1val1_d2val2
     849      3382260 :       unary%d3val2 = -x%d3val2
     850      3382260 :    end function unary_minus_self
     851              : 
     852      1600090 :    function exp_self(x) result(unary)
     853              :       type(auto_diff_real_2var_order3), intent(in) :: x
     854              :       type(auto_diff_real_2var_order3) :: unary
     855      1600090 :       real(dp) :: q3
     856      1600090 :       real(dp) :: q2
     857      1600090 :       real(dp) :: q1
     858      1600090 :       real(dp) :: q0
     859      1600090 :       q0 = exp(x%val)
     860      1600090 :       q1 = x%d2val1 + pow2(x%d1val1)
     861      1600090 :       q2 = x%d2val2 + pow2(x%d1val2)
     862      1600090 :       q3 = 2.0_dp*x%d1val1_d1val2
     863      1600090 :       unary%val = q0
     864      1600090 :       unary%d1val1 = q0*x%d1val1
     865      1600090 :       unary%d1val2 = q0*x%d1val2
     866      1600090 :       unary%d2val1 = q0*q1
     867      1600090 :       unary%d1val1_d1val2 = q0*(x%d1val1*x%d1val2 + x%d1val1_d1val2)
     868      1600090 :       unary%d2val2 = q0*q2
     869      1600090 :       unary%d3val1 = q0*(3.0_dp*x%d1val1*x%d2val1 + x%d3val1 + pow3(x%d1val1))
     870      1600090 :       unary%d2val1_d1val2 = q0*(q1*x%d1val2 + q3*x%d1val1 + x%d2val1_d1val2)
     871      1600090 :       unary%d1val1_d2val2 = q0*(q2*x%d1val1 + q3*x%d1val2 + x%d1val1_d2val2)
     872      1600090 :       unary%d3val2 = q0*(3.0_dp*x%d1val2*x%d2val2 + x%d3val2 + pow3(x%d1val2))
     873      1600090 :    end function exp_self
     874              : 
     875            0 :    function expm1_self(x) result(unary)
     876              :       type(auto_diff_real_2var_order3), intent(in) :: x
     877              :       type(auto_diff_real_2var_order3) :: unary
     878            0 :       real(dp) :: q3
     879            0 :       real(dp) :: q2
     880            0 :       real(dp) :: q1
     881            0 :       real(dp) :: q0
     882            0 :       q0 = exp(x%val)
     883            0 :       q1 = x%d2val1 + pow2(x%d1val1)
     884            0 :       q2 = x%d2val2 + pow2(x%d1val2)
     885            0 :       q3 = 2.0_dp*x%d1val1_d1val2
     886            0 :       unary%val = expm1(x%val)
     887            0 :       unary%d1val1 = q0*x%d1val1
     888            0 :       unary%d1val2 = q0*x%d1val2
     889            0 :       unary%d2val1 = q0*q1
     890            0 :       unary%d1val1_d1val2 = q0*(x%d1val1*x%d1val2 + x%d1val1_d1val2)
     891            0 :       unary%d2val2 = q0*q2
     892            0 :       unary%d3val1 = q0*(3.0_dp*x%d1val1*x%d2val1 + x%d3val1 + pow3(x%d1val1))
     893            0 :       unary%d2val1_d1val2 = q0*(q1*x%d1val2 + q3*x%d1val1 + x%d2val1_d1val2)
     894            0 :       unary%d1val1_d2val2 = q0*(q2*x%d1val1 + q3*x%d1val2 + x%d1val1_d2val2)
     895            0 :       unary%d3val2 = q0*(3.0_dp*x%d1val2*x%d2val2 + x%d3val2 + pow3(x%d1val2))
     896            0 :    end function expm1_self
     897              : 
     898            0 :    function exp10_self(x) result(unary)
     899              :       type(auto_diff_real_2var_order3), intent(in) :: x
     900              :       type(auto_diff_real_2var_order3) :: unary
     901            0 :       real(dp) :: q8
     902            0 :       real(dp) :: q7
     903            0 :       real(dp) :: q6
     904            0 :       real(dp) :: q5
     905            0 :       real(dp) :: q4
     906            0 :       real(dp) :: q3
     907            0 :       real(dp) :: q2
     908              :       real(dp) :: q1
     909            0 :       real(dp) :: q0
     910            0 :       q0 = pow(10.0_dp, x%val)
     911            0 :       q1 = ln10
     912            0 :       q2 = q0*q1
     913            0 :       q3 = q1*pow2(x%d1val1) + x%d2val1
     914            0 :       q4 = q1*x%d1val2
     915            0 :       q5 = q1*pow2(x%d1val2) + x%d2val2
     916            0 :       q6 = q1*x%d1val1
     917            0 :       q7 = pow2(q1)
     918            0 :       q8 = 2.0_dp*x%d1val1_d1val2
     919            0 :       unary%val = q0
     920            0 :       unary%d1val1 = q2*x%d1val1
     921            0 :       unary%d1val2 = q2*x%d1val2
     922            0 :       unary%d2val1 = q2*q3
     923            0 :       unary%d1val1_d1val2 = q2*(q4*x%d1val1 + x%d1val1_d1val2)
     924            0 :       unary%d2val2 = q2*q5
     925            0 :       unary%d3val1 = q2*(3.0_dp*q6*x%d2val1 + q7*pow3(x%d1val1) + x%d3val1)
     926            0 :       unary%d2val1_d1val2 = q2*(q3*q4 + q6*q8 + x%d2val1_d1val2)
     927            0 :       unary%d1val1_d2val2 = q2*(q4*q8 + q5*q6 + x%d1val1_d2val2)
     928            0 :       unary%d3val2 = q2*(3.0_dp*q4*x%d2val2 + q7*pow3(x%d1val2) + x%d3val2)
     929            0 :    end function exp10_self
     930              : 
     931            0 :    function powm1_self(x) result(unary)
     932              :       type(auto_diff_real_2var_order3), intent(in) :: x
     933              :       type(auto_diff_real_2var_order3) :: unary
     934            0 :       real(dp) :: q12
     935            0 :       real(dp) :: q11
     936            0 :       real(dp) :: q10
     937            0 :       real(dp) :: q9
     938            0 :       real(dp) :: q8
     939            0 :       real(dp) :: q7
     940            0 :       real(dp) :: q6
     941            0 :       real(dp) :: q5
     942            0 :       real(dp) :: q4
     943            0 :       real(dp) :: q3
     944            0 :       real(dp) :: q2
     945            0 :       real(dp) :: q1
     946              :       real(dp) :: q0
     947            0 :       q0 = pow2(x%val)
     948            0 :       q1 = powm1(q0)
     949            0 :       q2 = powm1(pow3(x%val))
     950            0 :       q3 = x%d2val1*x%val
     951            0 :       q4 = pow2(x%d1val1)
     952            0 :       q5 = 2.0_dp*x%d1val1
     953            0 :       q6 = x%d1val1_d1val2*x%val
     954            0 :       q7 = x%d2val2*x%val
     955            0 :       q8 = -q7
     956            0 :       q9 = pow2(x%d1val2)
     957            0 :       q10 = powm1(pow4(x%val))
     958            0 :       q11 = 4.0_dp*q6
     959            0 :       q12 = 6.0_dp*x%d1val2
     960            0 :       unary%val = powm1(x%val)
     961            0 :       unary%d1val1 = -q1*x%d1val1
     962            0 :       unary%d1val2 = -q1*x%d1val2
     963            0 :       unary%d2val1 = q2*(2.0_dp*q4 - q3)
     964            0 :       unary%d1val1_d1val2 = q2*(q5*x%d1val2 - q6)
     965            0 :       unary%d2val2 = q2*(2.0_dp*q9 + q8)
     966            0 :       unary%d3val1 = q10*(-6.0_dp*pow3(x%d1val1) + 6.0_dp*q3*x%d1val1 - q0*x%d3val1)
     967            0 :       unary%d2val1_d1val2 = q10*(2.0_dp*q3*x%d1val2 - q0*x%d2val1_d1val2 + q11*x%d1val1 - q12*q4)
     968            0 :       unary%d1val1_d2val2 = q10*(-q0*x%d1val1_d2val2 + q11*x%d1val2 - q5*(3.0_dp*q9 + q8))
     969            0 :       unary%d3val2 = q10*(-6.0_dp*pow3(x%d1val2) - q0*x%d3val2 + q12*q7)
     970            0 :    end function powm1_self
     971              : 
     972      4269482 :    function log_self(x) result(unary)
     973              :       type(auto_diff_real_2var_order3), intent(in) :: x
     974              :       type(auto_diff_real_2var_order3) :: unary
     975      4269482 :       real(dp) :: q9
     976      4269482 :       real(dp) :: q8
     977      4269482 :       real(dp) :: q7
     978      4269482 :       real(dp) :: q6
     979      4269482 :       real(dp) :: q5
     980      4269482 :       real(dp) :: q4
     981      4269482 :       real(dp) :: q3
     982      4269482 :       real(dp) :: q2
     983              :       real(dp) :: q1
     984      4269482 :       real(dp) :: q0
     985      4269482 :       q0 = powm1(x%val)
     986      4269482 :       q1 = pow2(x%val)
     987      4269482 :       q2 = powm1(q1)
     988      4269482 :       q3 = x%d2val1*x%val
     989      4269482 :       q4 = pow2(x%d1val1)
     990      4269482 :       q5 = x%d1val1_d1val2*x%val
     991      4269482 :       q6 = x%d2val2*x%val
     992      4269482 :       q7 = pow2(x%d1val2)
     993      4269482 :       q8 = powm1(pow3(x%val))
     994      4269482 :       q9 = 2.0_dp*x%d1val2
     995      4269482 :       unary%val = log(x%val)
     996      4269482 :       unary%d1val1 = q0*x%d1val1
     997      4269482 :       unary%d1val2 = q0*x%d1val2
     998      4269482 :       unary%d2val1 = q2*(q3 - q4)
     999      4269482 :       unary%d1val1_d1val2 = q2*(q5 - x%d1val1*x%d1val2)
    1000      4269482 :       unary%d2val2 = q2*(q6 - q7)
    1001      4269482 :       unary%d3val1 = q8*(-3.0_dp*q3*x%d1val1 + 2.0_dp*pow3(x%d1val1) + q1*x%d3val1)
    1002      4269482 :       unary%d2val1_d1val2 = q8*(-2.0_dp*q5*x%d1val1 + q1*x%d2val1_d1val2 - q3*x%d1val2 + q4*q9)
    1003      4269482 :       unary%d1val1_d2val2 = q8*(q1*x%d1val1_d2val2 - q5*q9 + x%d1val1*(2.0_dp*q7 - q6))
    1004      4269482 :       unary%d3val2 = q8*(-3.0_dp*q6*x%d1val2 + 2.0_dp*pow3(x%d1val2) + q1*x%d3val2)
    1005      4269482 :    end function log_self
    1006              : 
    1007            0 :    function log1p_self(x) result(unary)
    1008              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1009              :       type(auto_diff_real_2var_order3) :: unary
    1010            0 :       real(dp) :: q10
    1011            0 :       real(dp) :: q9
    1012            0 :       real(dp) :: q8
    1013            0 :       real(dp) :: q7
    1014            0 :       real(dp) :: q6
    1015            0 :       real(dp) :: q5
    1016            0 :       real(dp) :: q4
    1017            0 :       real(dp) :: q3
    1018              :       real(dp) :: q2
    1019            0 :       real(dp) :: q1
    1020              :       real(dp) :: q0
    1021            0 :       q0 = x%val + 1
    1022            0 :       q1 = powm1(q0)
    1023            0 :       q2 = pow2(q0)
    1024            0 :       q3 = powm1(q2)
    1025            0 :       q4 = pow2(x%d1val1)
    1026            0 :       q5 = q0*x%d2val1
    1027            0 :       q6 = q0*x%d1val1_d1val2
    1028            0 :       q7 = pow2(x%d1val2)
    1029            0 :       q8 = q0*x%d2val2
    1030            0 :       q9 = powm1(pow3(q0))
    1031            0 :       q10 = 2.0_dp*q6
    1032            0 :       unary%val = log1p(x%val)
    1033            0 :       unary%d1val1 = q1*x%d1val1
    1034            0 :       unary%d1val2 = q1*x%d1val2
    1035            0 :       unary%d2val1 = q3*(-q4 + q5)
    1036            0 :       unary%d1val1_d1val2 = q3*(q6 - x%d1val1*x%d1val2)
    1037            0 :       unary%d2val2 = q3*(-q7 + q8)
    1038            0 :       unary%d3val1 = q9*(-3.0_dp*q5*x%d1val1 + 2.0_dp*pow3(x%d1val1) + q2*x%d3val1)
    1039            0 :       unary%d2val1_d1val2 = q9*(-q10*x%d1val1 + q2*x%d2val1_d1val2 + q4*x%d1val2 + x%d1val2*(q4 - q5))
    1040            0 :       unary%d1val1_d2val2 = q9*(-q10*x%d1val2 + q2*x%d1val1_d2val2 + x%d1val1*(2.0_dp*q7 - q8))
    1041            0 :       unary%d3val2 = q9*(-3.0_dp*q8*x%d1val2 + 2.0_dp*pow3(x%d1val2) + q2*x%d3val2)
    1042            0 :    end function log1p_self
    1043              : 
    1044            0 :    function safe_log_self(x) result(unary)
    1045              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1046              :       type(auto_diff_real_2var_order3) :: unary
    1047            0 :       real(dp) :: q9
    1048            0 :       real(dp) :: q8
    1049            0 :       real(dp) :: q7
    1050            0 :       real(dp) :: q6
    1051            0 :       real(dp) :: q5
    1052            0 :       real(dp) :: q4
    1053            0 :       real(dp) :: q3
    1054            0 :       real(dp) :: q2
    1055              :       real(dp) :: q1
    1056            0 :       real(dp) :: q0
    1057            0 :       q0 = powm1(x%val)
    1058            0 :       q1 = pow2(x%val)
    1059            0 :       q2 = powm1(q1)
    1060            0 :       q3 = x%d2val1*x%val
    1061            0 :       q4 = pow2(x%d1val1)
    1062            0 :       q5 = x%d1val1_d1val2*x%val
    1063            0 :       q6 = x%d2val2*x%val
    1064            0 :       q7 = pow2(x%d1val2)
    1065            0 :       q8 = powm1(pow3(x%val))
    1066            0 :       q9 = 2.0_dp*x%d1val2
    1067            0 :       unary%val = safe_log(x%val)
    1068            0 :       unary%d1val1 = q0*x%d1val1
    1069            0 :       unary%d1val2 = q0*x%d1val2
    1070            0 :       unary%d2val1 = q2*(q3 - q4)
    1071            0 :       unary%d1val1_d1val2 = q2*(q5 - x%d1val1*x%d1val2)
    1072            0 :       unary%d2val2 = q2*(q6 - q7)
    1073            0 :       unary%d3val1 = q8*(-3.0_dp*q3*x%d1val1 + 2.0_dp*pow3(x%d1val1) + q1*x%d3val1)
    1074            0 :       unary%d2val1_d1val2 = q8*(-2.0_dp*q5*x%d1val1 + q1*x%d2val1_d1val2 - q3*x%d1val2 + q4*q9)
    1075            0 :       unary%d1val1_d2val2 = q8*(q1*x%d1val1_d2val2 - q5*q9 + x%d1val1*(2.0_dp*q7 - q6))
    1076            0 :       unary%d3val2 = q8*(-3.0_dp*q6*x%d1val2 + 2.0_dp*pow3(x%d1val2) + q1*x%d3val2)
    1077            0 :    end function safe_log_self
    1078              : 
    1079        91040 :    function log10_self(x) result(unary)
    1080              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1081              :       type(auto_diff_real_2var_order3) :: unary
    1082        91040 :       real(dp) :: q10
    1083        91040 :       real(dp) :: q9
    1084        91040 :       real(dp) :: q8
    1085        91040 :       real(dp) :: q7
    1086        91040 :       real(dp) :: q6
    1087        91040 :       real(dp) :: q5
    1088              :       real(dp) :: q4
    1089        91040 :       real(dp) :: q3
    1090        91040 :       real(dp) :: q2
    1091        91040 :       real(dp) :: q1
    1092        91040 :       real(dp) :: q0
    1093        91040 :       q0 = powm1(ln10)
    1094        91040 :       q1 = q0*powm1(x%val)
    1095        91040 :       q2 = x%d2val1*x%val
    1096        91040 :       q3 = pow2(x%d1val1)
    1097        91040 :       q4 = pow2(x%val)
    1098        91040 :       q5 = q0*powm1(q4)
    1099        91040 :       q6 = x%d1val1_d1val2*x%val
    1100        91040 :       q7 = x%d2val2*x%val
    1101        91040 :       q8 = pow2(x%d1val2)
    1102        91040 :       q9 = q0*powm1(pow3(x%val))
    1103        91040 :       q10 = 2.0_dp*x%d1val2
    1104        91040 :       unary%val = q0*log(x%val)
    1105        91040 :       unary%d1val1 = q1*x%d1val1
    1106        91040 :       unary%d1val2 = q1*x%d1val2
    1107        91040 :       unary%d2val1 = q5*(q2 - q3)
    1108        91040 :       unary%d1val1_d1val2 = q5*(q6 - x%d1val1*x%d1val2)
    1109        91040 :       unary%d2val2 = q5*(q7 - q8)
    1110        91040 :       unary%d3val1 = q9*(-3.0_dp*q2*x%d1val1 + 2.0_dp*pow3(x%d1val1) + q4*x%d3val1)
    1111        91040 :       unary%d2val1_d1val2 = q9*(-2.0_dp*q6*x%d1val1 + q10*q3 - q2*x%d1val2 + q4*x%d2val1_d1val2)
    1112        91040 :       unary%d1val1_d2val2 = q9*(-q10*q6 + q4*x%d1val1_d2val2 + x%d1val1*(2.0_dp*q8 - q7))
    1113        91040 :       unary%d3val2 = q9*(-3.0_dp*q7*x%d1val2 + 2.0_dp*pow3(x%d1val2) + q4*x%d3val2)
    1114        91040 :    end function log10_self
    1115              : 
    1116            0 :    function safe_log10_self(x) result(unary)
    1117              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1118              :       type(auto_diff_real_2var_order3) :: unary
    1119            0 :       real(dp) :: q10
    1120            0 :       real(dp) :: q9
    1121            0 :       real(dp) :: q8
    1122            0 :       real(dp) :: q7
    1123            0 :       real(dp) :: q6
    1124            0 :       real(dp) :: q5
    1125              :       real(dp) :: q4
    1126            0 :       real(dp) :: q3
    1127            0 :       real(dp) :: q2
    1128            0 :       real(dp) :: q1
    1129            0 :       real(dp) :: q0
    1130            0 :       q0 = powm1(ln10)
    1131            0 :       q1 = q0*powm1(x%val)
    1132            0 :       q2 = x%d2val1*x%val
    1133            0 :       q3 = pow2(x%d1val1)
    1134            0 :       q4 = pow2(x%val)
    1135            0 :       q5 = q0*powm1(q4)
    1136            0 :       q6 = x%d1val1_d1val2*x%val
    1137            0 :       q7 = x%d2val2*x%val
    1138            0 :       q8 = pow2(x%d1val2)
    1139            0 :       q9 = q0*powm1(pow3(x%val))
    1140            0 :       q10 = 2.0_dp*x%d1val2
    1141            0 :       unary%val = q0*safe_log(x%val)
    1142            0 :       unary%d1val1 = q1*x%d1val1
    1143            0 :       unary%d1val2 = q1*x%d1val2
    1144            0 :       unary%d2val1 = q5*(q2 - q3)
    1145            0 :       unary%d1val1_d1val2 = q5*(q6 - x%d1val1*x%d1val2)
    1146            0 :       unary%d2val2 = q5*(q7 - q8)
    1147            0 :       unary%d3val1 = q9*(-3.0_dp*q2*x%d1val1 + 2.0_dp*pow3(x%d1val1) + q4*x%d3val1)
    1148            0 :       unary%d2val1_d1val2 = q9*(-2.0_dp*q6*x%d1val1 + q10*q3 - q2*x%d1val2 + q4*x%d2val1_d1val2)
    1149            0 :       unary%d1val1_d2val2 = q9*(-q10*q6 + q4*x%d1val1_d2val2 + x%d1val1*(2.0_dp*q8 - q7))
    1150            0 :       unary%d3val2 = q9*(-3.0_dp*q7*x%d1val2 + 2.0_dp*pow3(x%d1val2) + q4*x%d3val2)
    1151            0 :    end function safe_log10_self
    1152              : 
    1153            0 :    function log2_self(x) result(unary)
    1154              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1155              :       type(auto_diff_real_2var_order3) :: unary
    1156            0 :       real(dp) :: q10
    1157            0 :       real(dp) :: q9
    1158            0 :       real(dp) :: q8
    1159            0 :       real(dp) :: q7
    1160            0 :       real(dp) :: q6
    1161            0 :       real(dp) :: q5
    1162              :       real(dp) :: q4
    1163            0 :       real(dp) :: q3
    1164            0 :       real(dp) :: q2
    1165            0 :       real(dp) :: q1
    1166            0 :       real(dp) :: q0
    1167            0 :       q0 = powm1(log(2.0_dp))
    1168            0 :       q1 = q0*powm1(x%val)
    1169            0 :       q2 = x%d2val1*x%val
    1170            0 :       q3 = pow2(x%d1val1)
    1171            0 :       q4 = pow2(x%val)
    1172            0 :       q5 = q0*powm1(q4)
    1173            0 :       q6 = x%d1val1_d1val2*x%val
    1174            0 :       q7 = x%d2val2*x%val
    1175            0 :       q8 = pow2(x%d1val2)
    1176            0 :       q9 = q0*powm1(pow3(x%val))
    1177            0 :       q10 = 2.0_dp*x%d1val2
    1178            0 :       unary%val = q0*log(x%val)
    1179            0 :       unary%d1val1 = q1*x%d1val1
    1180            0 :       unary%d1val2 = q1*x%d1val2
    1181            0 :       unary%d2val1 = q5*(q2 - q3)
    1182            0 :       unary%d1val1_d1val2 = q5*(q6 - x%d1val1*x%d1val2)
    1183            0 :       unary%d2val2 = q5*(q7 - q8)
    1184            0 :       unary%d3val1 = q9*(-3.0_dp*q2*x%d1val1 + 2.0_dp*pow3(x%d1val1) + q4*x%d3val1)
    1185            0 :       unary%d2val1_d1val2 = q9*(-2.0_dp*q6*x%d1val1 + q10*q3 - q2*x%d1val2 + q4*x%d2val1_d1val2)
    1186            0 :       unary%d1val1_d2val2 = q9*(-q10*q6 + q4*x%d1val1_d2val2 + x%d1val1*(2.0_dp*q8 - q7))
    1187            0 :       unary%d3val2 = q9*(-3.0_dp*q7*x%d1val2 + 2.0_dp*pow3(x%d1val2) + q4*x%d3val2)
    1188            0 :    end function log2_self
    1189              : 
    1190            0 :    function sin_self(x) result(unary)
    1191              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1192              :       type(auto_diff_real_2var_order3) :: unary
    1193            0 :       real(dp) :: q8
    1194            0 :       real(dp) :: q7
    1195            0 :       real(dp) :: q6
    1196            0 :       real(dp) :: q5
    1197            0 :       real(dp) :: q4
    1198            0 :       real(dp) :: q3
    1199            0 :       real(dp) :: q2
    1200            0 :       real(dp) :: q1
    1201            0 :       real(dp) :: q0
    1202            0 :       q0 = sin(x%val)
    1203            0 :       q1 = cos(x%val)
    1204            0 :       q2 = q1*x%d1val2
    1205            0 :       q3 = pow2(x%d1val1)
    1206            0 :       q4 = q0*x%d1val2
    1207            0 :       q5 = pow2(x%d1val2)
    1208            0 :       q6 = q0*x%d1val1
    1209            0 :       q7 = 2.0_dp*x%d1val1_d1val2
    1210            0 :       q8 = q0*x%d2val2
    1211            0 :       unary%val = q0
    1212            0 :       unary%d1val1 = q1*x%d1val1
    1213            0 :       unary%d1val2 = q2
    1214            0 :       unary%d2val1 = -q0*q3 + q1*x%d2val1
    1215            0 :       unary%d1val1_d1val2 = q1*x%d1val1_d1val2 - q4*x%d1val1
    1216            0 :       unary%d2val2 = -q0*q5 + q1*x%d2val2
    1217            0 :       unary%d3val1 = -3.0_dp*q6*x%d2val1 + q1*x%d3val1 - q1*pow3(x%d1val1)
    1218            0 :       unary%d2val1_d1val2 = q1*x%d2val1_d1val2 - q2*q3 - q4*x%d2val1 - q6*q7
    1219            0 :       unary%d1val1_d2val2 = q1*x%d1val1_d2val2 - q4*q7 - x%d1val1*(q1*q5 + q8)
    1220            0 :       unary%d3val2 = -3.0_dp*q8*x%d1val2 + q1*x%d3val2 - q1*pow3(x%d1val2)
    1221            0 :    end function sin_self
    1222              : 
    1223            0 :    function cos_self(x) result(unary)
    1224              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1225              :       type(auto_diff_real_2var_order3) :: unary
    1226            0 :       real(dp) :: q8
    1227            0 :       real(dp) :: q7
    1228            0 :       real(dp) :: q6
    1229            0 :       real(dp) :: q5
    1230            0 :       real(dp) :: q4
    1231            0 :       real(dp) :: q3
    1232            0 :       real(dp) :: q2
    1233            0 :       real(dp) :: q1
    1234            0 :       real(dp) :: q0
    1235            0 :       q0 = cos(x%val)
    1236            0 :       q1 = sin(x%val)
    1237            0 :       q2 = q1*x%d1val2
    1238            0 :       q3 = pow2(x%d1val1)
    1239            0 :       q4 = q0*x%d1val2
    1240            0 :       q5 = pow2(x%d1val2)
    1241            0 :       q6 = q0*x%d1val1
    1242            0 :       q7 = 2.0_dp*x%d1val1_d1val2
    1243            0 :       q8 = q0*x%d2val2
    1244            0 :       unary%val = q0
    1245            0 :       unary%d1val1 = -q1*x%d1val1
    1246            0 :       unary%d1val2 = -q2
    1247            0 :       unary%d2val1 = -q0*q3 - q1*x%d2val1
    1248            0 :       unary%d1val1_d1val2 = -q1*x%d1val1_d1val2 - q4*x%d1val1
    1249            0 :       unary%d2val2 = -q0*q5 - q1*x%d2val2
    1250            0 :       unary%d3val1 = -3.0_dp*q6*x%d2val1 - q1*x%d3val1 + q1*pow3(x%d1val1)
    1251            0 :       unary%d2val1_d1val2 = -q1*x%d2val1_d1val2 + q2*q3 - q4*x%d2val1 - q6*q7
    1252            0 :       unary%d1val1_d2val2 = -q1*x%d1val1_d2val2 - q4*q7 + x%d1val1*(q1*q5 - q8)
    1253            0 :       unary%d3val2 = -3.0_dp*q8*x%d1val2 - q1*x%d3val2 + q1*pow3(x%d1val2)
    1254            0 :    end function cos_self
    1255              : 
    1256            0 :    function tan_self(x) result(unary)
    1257              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1258              :       type(auto_diff_real_2var_order3) :: unary
    1259            0 :       real(dp) :: q15
    1260            0 :       real(dp) :: q14
    1261            0 :       real(dp) :: q13
    1262            0 :       real(dp) :: q12
    1263            0 :       real(dp) :: q11
    1264            0 :       real(dp) :: q10
    1265            0 :       real(dp) :: q9
    1266            0 :       real(dp) :: q8
    1267            0 :       real(dp) :: q7
    1268            0 :       real(dp) :: q6
    1269            0 :       real(dp) :: q5
    1270            0 :       real(dp) :: q4
    1271            0 :       real(dp) :: q3
    1272            0 :       real(dp) :: q2
    1273            0 :       real(dp) :: q1
    1274              :       real(dp) :: q0
    1275            0 :       q0 = tan(x%val)
    1276            0 :       q1 = pow2(q0)
    1277            0 :       q2 = q1 + 1
    1278            0 :       q3 = powm1(pow2(cos(x%val)))
    1279            0 :       q4 = pow2(x%d1val1)
    1280            0 :       q5 = 2.0_dp*q0
    1281            0 :       q6 = q4*q5 + x%d2val1
    1282            0 :       q7 = q5*x%d1val2
    1283            0 :       q8 = pow2(x%d1val2)
    1284            0 :       q9 = q0*x%d1val1
    1285            0 :       q10 = pow3(x%d1val1)
    1286            0 :       q11 = 2.0_dp*q3
    1287            0 :       q12 = 4.0_dp*q1
    1288            0 :       q13 = 4.0_dp*x%d1val1_d1val2
    1289            0 :       q14 = q0*x%d2val2
    1290            0 :       q15 = pow3(x%d1val2)
    1291            0 :       unary%val = q0
    1292            0 :       unary%d1val1 = q2*x%d1val1
    1293            0 :       unary%d1val2 = q2*x%d1val2
    1294            0 :       unary%d2val1 = q3*q6
    1295            0 :       unary%d1val1_d1val2 = q3*(q7*x%d1val1 + x%d1val1_d1val2)
    1296            0 :       unary%d2val2 = q3*(q5*q8 + x%d2val2)
    1297            0 :       unary%d3val1 = q3*(6.0_dp*q9*x%d2val1 + q10*q11 + q10*q12 + x%d3val1)
    1298            0 :       unary%d2val1_d1val2 = q3*(q11*q4*x%d1val2 + q13*q9 + q6*q7 + x%d2val1_d1val2)
    1299            0 :       unary%d1val1_d2val2 = q3*(2.0_dp*x%d1val1*(2.0_dp*q1*q8 + q14 + q3*q8) + q0*q13*x%d1val2 + x%d1val1_d2val2)
    1300            0 :       unary%d3val2 = q3*(6.0_dp*q14*x%d1val2 + q11*q15 + q12*q15 + x%d3val2)
    1301            0 :    end function tan_self
    1302              : 
    1303            0 :    function sinpi_self(x) result(unary)
    1304              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1305              :       type(auto_diff_real_2var_order3) :: unary
    1306            0 :       real(dp) :: q11
    1307            0 :       real(dp) :: q10
    1308            0 :       real(dp) :: q9
    1309            0 :       real(dp) :: q8
    1310            0 :       real(dp) :: q7
    1311            0 :       real(dp) :: q6
    1312            0 :       real(dp) :: q5
    1313            0 :       real(dp) :: q4
    1314            0 :       real(dp) :: q3
    1315            0 :       real(dp) :: q2
    1316            0 :       real(dp) :: q1
    1317              :       real(dp) :: q0
    1318            0 :       q0 = pi*x%val
    1319            0 :       q1 = sin(q0)
    1320            0 :       q2 = cos(q0)
    1321            0 :       q3 = pi*q2
    1322            0 :       q4 = pow2(x%d1val1)
    1323            0 :       q5 = pi*q1
    1324            0 :       q6 = q5*x%d1val2
    1325            0 :       q7 = pow2(x%d1val2)
    1326            0 :       q8 = q5*x%d1val1
    1327            0 :       q9 = q2*pow2(pi)
    1328            0 :       q10 = 2.0_dp*x%d1val1_d1val2
    1329            0 :       q11 = q1*x%d2val2
    1330            0 :       unary%val = q1
    1331            0 :       unary%d1val1 = q3*x%d1val1
    1332            0 :       unary%d1val2 = q3*x%d1val2
    1333            0 :       unary%d2val1 = pi*(q2*x%d2val1 - q4*q5)
    1334            0 :       unary%d1val1_d1val2 = pi*(q2*x%d1val1_d1val2 - q6*x%d1val1)
    1335            0 :       unary%d2val2 = pi*(q2*x%d2val2 - q5*q7)
    1336            0 :       unary%d3val1 = pi*(-3.0_dp*q8*x%d2val1 + q2*x%d3val1 - q9*pow3(x%d1val1))
    1337            0 :       unary%d2val1_d1val2 = pi*(-q10*q8 + q2*x%d2val1_d1val2 - q4*q9*x%d1val2 - q6*x%d2val1)
    1338            0 :       unary%d1val1_d2val2 = -pi*(pi*x%d1val1*(q11 + q3*q7) + q10*q6 - q2*x%d1val1_d2val2)
    1339            0 :       unary%d3val2 = pi*(-3.0_dp*pi*q11*x%d1val2 + q2*x%d3val2 - q9*pow3(x%d1val2))
    1340            0 :    end function sinpi_self
    1341              : 
    1342            0 :    function cospi_self(x) result(unary)
    1343              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1344              :       type(auto_diff_real_2var_order3) :: unary
    1345            0 :       real(dp) :: q11
    1346            0 :       real(dp) :: q10
    1347            0 :       real(dp) :: q9
    1348            0 :       real(dp) :: q8
    1349            0 :       real(dp) :: q7
    1350            0 :       real(dp) :: q6
    1351            0 :       real(dp) :: q5
    1352            0 :       real(dp) :: q4
    1353            0 :       real(dp) :: q3
    1354            0 :       real(dp) :: q2
    1355            0 :       real(dp) :: q1
    1356              :       real(dp) :: q0
    1357            0 :       q0 = pi*x%val
    1358            0 :       q1 = cos(q0)
    1359            0 :       q2 = sin(q0)
    1360            0 :       q3 = pi*q2
    1361            0 :       q4 = pow2(x%d1val1)
    1362            0 :       q5 = pi*q1
    1363            0 :       q6 = q5*x%d1val2
    1364            0 :       q7 = pow2(x%d1val2)
    1365            0 :       q8 = q5*x%d1val1
    1366            0 :       q9 = q2*pow2(pi)
    1367            0 :       q10 = 2.0_dp*x%d1val1_d1val2
    1368            0 :       q11 = q1*x%d2val2
    1369            0 :       unary%val = q1
    1370            0 :       unary%d1val1 = -q3*x%d1val1
    1371            0 :       unary%d1val2 = -q3*x%d1val2
    1372            0 :       unary%d2val1 = -pi*(q2*x%d2val1 + q4*q5)
    1373            0 :       unary%d1val1_d1val2 = -pi*(q2*x%d1val1_d1val2 + q6*x%d1val1)
    1374            0 :       unary%d2val2 = -pi*(q2*x%d2val2 + q5*q7)
    1375            0 :       unary%d3val1 = pi*(-3.0_dp*q8*x%d2val1 - q2*x%d3val1 + q9*pow3(x%d1val1))
    1376            0 :       unary%d2val1_d1val2 = pi*(-q10*q8 - q2*x%d2val1_d1val2 + q4*q9*x%d1val2 - q6*x%d2val1)
    1377            0 :       unary%d1val1_d2val2 = -pi*(-pi*x%d1val1*(-q11 + q3*q7) + q10*q6 + q2*x%d1val1_d2val2)
    1378            0 :       unary%d3val2 = pi*(-3.0_dp*pi*q11*x%d1val2 - q2*x%d3val2 + q9*pow3(x%d1val2))
    1379            0 :    end function cospi_self
    1380              : 
    1381            0 :    function tanpi_self(x) result(unary)
    1382              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1383              :       type(auto_diff_real_2var_order3) :: unary
    1384            0 :       real(dp) :: q21
    1385            0 :       real(dp) :: q20
    1386            0 :       real(dp) :: q19
    1387            0 :       real(dp) :: q18
    1388            0 :       real(dp) :: q17
    1389            0 :       real(dp) :: q16
    1390            0 :       real(dp) :: q15
    1391            0 :       real(dp) :: q14
    1392            0 :       real(dp) :: q13
    1393            0 :       real(dp) :: q12
    1394            0 :       real(dp) :: q11
    1395            0 :       real(dp) :: q10
    1396            0 :       real(dp) :: q9
    1397            0 :       real(dp) :: q8
    1398            0 :       real(dp) :: q7
    1399            0 :       real(dp) :: q6
    1400            0 :       real(dp) :: q5
    1401            0 :       real(dp) :: q4
    1402            0 :       real(dp) :: q3
    1403            0 :       real(dp) :: q2
    1404              :       real(dp) :: q1
    1405              :       real(dp) :: q0
    1406            0 :       q0 = pi*x%val
    1407            0 :       q1 = tan(q0)
    1408            0 :       q2 = pow2(q1)
    1409            0 :       q3 = q2 + 1
    1410            0 :       q4 = pi*q3
    1411            0 :       q5 = pi*q1
    1412            0 :       q6 = 2.0_dp*pow2(x%d1val1)
    1413            0 :       q7 = q5*q6 + x%d2val1
    1414            0 :       q8 = 2.0_dp*q5
    1415            0 :       q9 = q8*x%d1val2
    1416            0 :       q10 = powm1(pow2(cos(q0)))
    1417            0 :       q11 = pi*q10
    1418            0 :       q12 = pow2(x%d1val2)
    1419            0 :       q13 = 6.0_dp*q5
    1420            0 :       q14 = pow2(pi)
    1421            0 :       q15 = q14*pow3(x%d1val1)
    1422            0 :       q16 = 4.0_dp*q2
    1423            0 :       q17 = 2.0_dp*q3
    1424            0 :       q18 = pi*x%d1val1
    1425            0 :       q19 = 4.0_dp*q1
    1426            0 :       q20 = q19*x%d1val1_d1val2
    1427            0 :       q21 = q14*pow3(x%d1val2)
    1428            0 :       unary%val = q1
    1429            0 :       unary%d1val1 = q4*x%d1val1
    1430            0 :       unary%d1val2 = q4*x%d1val2
    1431            0 :       unary%d2val1 = q4*q7
    1432            0 :       unary%d1val1_d1val2 = q11*(q9*x%d1val1 + x%d1val1_d1val2)
    1433            0 :       unary%d2val2 = q4*(q12*q8 + x%d2val2)
    1434            0 :       unary%d3val1 = q4*(q13*x%d1val1*x%d2val1 + q15*q16 + q15*q17 + x%d3val1)
    1435            0 :       unary%d2val1_d1val2 = q11*(q10*q14*q6*x%d1val2 + q18*q20 + q7*q9 + x%d2val1_d1val2)
    1436            0 :       unary%d1val1_d2val2 = q4*(0.5_dp*q18*(4.0_dp*q12*q4 + 8.0_dp*pi*q12*q2 + q19*x%d2val2) + pi*q20*x%d1val2 + x%d1val1_d2val2)
    1437            0 :       unary%d3val2 = q4*(q13*x%d1val2*x%d2val2 + q16*q21 + q17*q21 + x%d3val2)
    1438            0 :    end function tanpi_self
    1439              : 
    1440        90596 :    function sinh_self(x) result(unary)
    1441              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1442              :       type(auto_diff_real_2var_order3) :: unary
    1443        90596 :       real(dp) :: q8
    1444        90596 :       real(dp) :: q7
    1445        90596 :       real(dp) :: q6
    1446        90596 :       real(dp) :: q5
    1447        90596 :       real(dp) :: q4
    1448        90596 :       real(dp) :: q3
    1449        90596 :       real(dp) :: q2
    1450        90596 :       real(dp) :: q1
    1451        90596 :       real(dp) :: q0
    1452        90596 :       q0 = sinh(x%val)
    1453        90596 :       q1 = cosh(x%val)
    1454        90596 :       q2 = q1*x%d1val2
    1455        90596 :       q3 = pow2(x%d1val1)
    1456        90596 :       q4 = q0*x%d1val2
    1457        90596 :       q5 = pow2(x%d1val2)
    1458        90596 :       q6 = q0*x%d1val1
    1459        90596 :       q7 = 2.0_dp*x%d1val1_d1val2
    1460        90596 :       q8 = q0*x%d2val2
    1461        90596 :       unary%val = q0
    1462        90596 :       unary%d1val1 = q1*x%d1val1
    1463        90596 :       unary%d1val2 = q2
    1464        90596 :       unary%d2val1 = q0*q3 + q1*x%d2val1
    1465        90596 :       unary%d1val1_d1val2 = q1*x%d1val1_d1val2 + q4*x%d1val1
    1466        90596 :       unary%d2val2 = q0*q5 + q1*x%d2val2
    1467        90596 :       unary%d3val1 = 3.0_dp*q6*x%d2val1 + q1*x%d3val1 + q1*pow3(x%d1val1)
    1468        90596 :       unary%d2val1_d1val2 = q1*x%d2val1_d1val2 + q2*q3 + q4*x%d2val1 + q6*q7
    1469        90596 :       unary%d1val1_d2val2 = q1*x%d1val1_d2val2 + q4*q7 + x%d1val1*(q1*q5 + q8)
    1470        90596 :       unary%d3val2 = 3.0_dp*q8*x%d1val2 + q1*x%d3val2 + q1*pow3(x%d1val2)
    1471        90596 :    end function sinh_self
    1472              : 
    1473        90596 :    function cosh_self(x) result(unary)
    1474              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1475              :       type(auto_diff_real_2var_order3) :: unary
    1476        90596 :       real(dp) :: q8
    1477        90596 :       real(dp) :: q7
    1478        90596 :       real(dp) :: q6
    1479        90596 :       real(dp) :: q5
    1480        90596 :       real(dp) :: q4
    1481        90596 :       real(dp) :: q3
    1482        90596 :       real(dp) :: q2
    1483        90596 :       real(dp) :: q1
    1484        90596 :       real(dp) :: q0
    1485        90596 :       q0 = cosh(x%val)
    1486        90596 :       q1 = sinh(x%val)
    1487        90596 :       q2 = q1*x%d1val2
    1488        90596 :       q3 = pow2(x%d1val1)
    1489        90596 :       q4 = q0*x%d1val2
    1490        90596 :       q5 = pow2(x%d1val2)
    1491        90596 :       q6 = q0*x%d1val1
    1492        90596 :       q7 = 2.0_dp*x%d1val1_d1val2
    1493        90596 :       q8 = q0*x%d2val2
    1494        90596 :       unary%val = q0
    1495        90596 :       unary%d1val1 = q1*x%d1val1
    1496        90596 :       unary%d1val2 = q2
    1497        90596 :       unary%d2val1 = q0*q3 + q1*x%d2val1
    1498        90596 :       unary%d1val1_d1val2 = q1*x%d1val1_d1val2 + q4*x%d1val1
    1499        90596 :       unary%d2val2 = q0*q5 + q1*x%d2val2
    1500        90596 :       unary%d3val1 = 3.0_dp*q6*x%d2val1 + q1*x%d3val1 + q1*pow3(x%d1val1)
    1501        90596 :       unary%d2val1_d1val2 = q1*x%d2val1_d1val2 + q2*q3 + q4*x%d2val1 + q6*q7
    1502        90596 :       unary%d1val1_d2val2 = q1*x%d1val1_d2val2 + q4*q7 + x%d1val1*(q1*q5 + q8)
    1503        90596 :       unary%d3val2 = 3.0_dp*q8*x%d1val2 + q1*x%d3val2 + q1*pow3(x%d1val2)
    1504        90596 :    end function cosh_self
    1505              : 
    1506       310914 :    function tanh_self(x) result(unary)
    1507              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1508              :       type(auto_diff_real_2var_order3) :: unary
    1509       310914 :       real(dp) :: q15
    1510       310914 :       real(dp) :: q14
    1511       310914 :       real(dp) :: q13
    1512       310914 :       real(dp) :: q12
    1513       310914 :       real(dp) :: q11
    1514       310914 :       real(dp) :: q10
    1515       310914 :       real(dp) :: q9
    1516       310914 :       real(dp) :: q8
    1517       310914 :       real(dp) :: q7
    1518       310914 :       real(dp) :: q6
    1519       310914 :       real(dp) :: q5
    1520       310914 :       real(dp) :: q4
    1521       310914 :       real(dp) :: q3
    1522       310914 :       real(dp) :: q2
    1523       310914 :       real(dp) :: q1
    1524              :       real(dp) :: q0
    1525       310914 :       q0 = tanh(x%val)
    1526       310914 :       q1 = pow2(q0)
    1527       310914 :       q2 = q1 - 1
    1528       310914 :       q3 = powm1(pow2(cosh(x%val)))
    1529       310914 :       q4 = pow2(x%d1val1)
    1530       310914 :       q5 = 2.0_dp*q0
    1531       310914 :       q6 = q4*q5 - x%d2val1
    1532       310914 :       q7 = q5*x%d1val2
    1533       310914 :       q8 = pow2(x%d1val2)
    1534       310914 :       q9 = pow3(x%d1val1)
    1535       310914 :       q10 = q0*x%d1val1
    1536       310914 :       q11 = 6.0_dp*q1
    1537       310914 :       q12 = 4.0_dp*x%d1val1_d1val2
    1538       310914 :       q13 = q8*x%d1val1
    1539       310914 :       q14 = q0*x%d1val2
    1540       310914 :       q15 = pow3(x%d1val2)
    1541       310914 :       unary%val = q0
    1542       310914 :       unary%d1val1 = -q2*x%d1val1
    1543       310914 :       unary%d1val2 = -q2*x%d1val2
    1544       310914 :       unary%d2val1 = -q3*q6
    1545       310914 :       unary%d1val1_d1val2 = -q3*(q7*x%d1val1 - x%d1val1_d1val2)
    1546       310914 :       unary%d2val2 = -q3*(q5*q8 - x%d2val2)
    1547       310914 :       unary%d3val1 = q3*(-2.0_dp*q9 - 6.0_dp*q10*x%d2val1 + q11*q9 + x%d3val1)
    1548       310914 :       unary%d2val1_d1val2 = -q3*(2.0_dp*q3*q4*x%d1val2 + q10*q12 - q6*q7 - x%d2val1_d1val2)
    1549       310914 :       unary%d1val1_d2val2 = -q3*(2.0_dp*q13 - q11*q13 + q12*q14 + q5*x%d1val1*x%d2val2 - x%d1val1_d2val2)
    1550       310914 :       unary%d3val2 = q3*(-2.0_dp*q15 - 6.0_dp*q14*x%d2val2 + q11*q15 + x%d3val2)
    1551       310914 :    end function tanh_self
    1552              : 
    1553            0 :    function asin_self(x) result(unary)
    1554              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1555              :       type(auto_diff_real_2var_order3) :: unary
    1556            0 :       real(dp) :: q15
    1557            0 :       real(dp) :: q14
    1558            0 :       real(dp) :: q13
    1559            0 :       real(dp) :: q12
    1560            0 :       real(dp) :: q11
    1561            0 :       real(dp) :: q10
    1562            0 :       real(dp) :: q9
    1563            0 :       real(dp) :: q8
    1564            0 :       real(dp) :: q7
    1565            0 :       real(dp) :: q6
    1566              :       real(dp) :: q5
    1567            0 :       real(dp) :: q4
    1568            0 :       real(dp) :: q3
    1569            0 :       real(dp) :: q2
    1570            0 :       real(dp) :: q1
    1571            0 :       real(dp) :: q0
    1572            0 :       q0 = pow2(x%val)
    1573            0 :       q1 = 1 - q0
    1574            0 :       q2 = powm1(sqrt(q1))
    1575            0 :       q3 = powm1(pow3(sqrt(q1)))
    1576            0 :       q4 = pow2(x%d1val1)
    1577            0 :       q5 = q0 - 1
    1578            0 :       q6 = q4*x%val - q5*x%d2val1
    1579            0 :       q7 = x%d1val1*x%d1val2
    1580            0 :       q8 = pow2(x%d1val2)
    1581            0 :       q9 = powm1(pow5(sqrt(q1)))
    1582            0 :       q10 = 3.0_dp*q0
    1583            0 :       q11 = pow2(q5)
    1584            0 :       q12 = q5*x%d1val1
    1585            0 :       q13 = 2.0_dp*x%d1val1_d1val2*x%val
    1586            0 :       q14 = q5*x%d1val2
    1587            0 :       q15 = x%d2val2*x%val
    1588            0 :       unary%val = asin(x%val)
    1589            0 :       unary%d1val1 = q2*x%d1val1
    1590            0 :       unary%d1val2 = q2*x%d1val2
    1591            0 :       unary%d2val1 = q3*q6
    1592            0 :       unary%d1val1_d1val2 = q3*(q1*x%d1val1_d1val2 + q7*x%val)
    1593            0 :       unary%d2val2 = q3*(-q5*x%d2val2 + q8*x%val)
    1594            0 :       unary%d3val1 = q9*(q10*pow3(x%d1val1) + q11*x%d3val1 - q12*(3.0_dp*x%d2val1*x%val + q4))
    1595              :       unary%d2val1_d1val2 = (q1*q6*x%d1val2*x%val &
    1596            0 :                              + q5*(-2.0_dp*q0*q4*x%d1val2 - q11*x%d2val1_d1val2 + q12*(q13 + q7)))*powm1(pow7(sqrt(q1)))
    1597            0 :       unary%d1val1_d2val2 = q9*(q11*x%d1val1_d2val2 - q13*q14 - x%d1val1*(-q10*q8 + q5*(q15 + q8)))
    1598            0 :       unary%d3val2 = q9*(q10*pow3(x%d1val2) + q11*x%d3val2 - q14*(3.0_dp*q15 + q8))
    1599            0 :    end function asin_self
    1600              : 
    1601            0 :    function acos_self(x) result(unary)
    1602              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1603              :       type(auto_diff_real_2var_order3) :: unary
    1604            0 :       real(dp) :: q17
    1605            0 :       real(dp) :: q16
    1606            0 :       real(dp) :: q15
    1607            0 :       real(dp) :: q14
    1608            0 :       real(dp) :: q13
    1609            0 :       real(dp) :: q12
    1610            0 :       real(dp) :: q11
    1611            0 :       real(dp) :: q10
    1612            0 :       real(dp) :: q9
    1613            0 :       real(dp) :: q8
    1614            0 :       real(dp) :: q7
    1615              :       real(dp) :: q6
    1616            0 :       real(dp) :: q5
    1617            0 :       real(dp) :: q4
    1618            0 :       real(dp) :: q3
    1619            0 :       real(dp) :: q2
    1620            0 :       real(dp) :: q1
    1621            0 :       real(dp) :: q0
    1622            0 :       q0 = pow2(x%val)
    1623            0 :       q1 = 1 - q0
    1624            0 :       q2 = powm1(sqrt(q1))
    1625            0 :       q3 = powm1(pow3(sqrt(q1)))
    1626            0 :       q4 = pow2(x%d1val1)
    1627            0 :       q5 = q4*x%val
    1628            0 :       q6 = q0 - 1
    1629            0 :       q7 = q6*x%d2val1
    1630            0 :       q8 = x%d1val1*x%d1val2
    1631            0 :       q9 = q6*x%d1val1_d1val2
    1632            0 :       q10 = pow2(x%d1val2)
    1633            0 :       q11 = powm1(pow7(sqrt(q1)))
    1634            0 :       q12 = pow3(q6)
    1635            0 :       q13 = 3.0_dp*q0
    1636            0 :       q14 = q1*q13
    1637            0 :       q15 = pow2(q6)
    1638            0 :       q16 = 2.0_dp*x%val
    1639            0 :       q17 = x%d2val2*x%val
    1640            0 :       unary%val = acos(x%val)
    1641            0 :       unary%d1val1 = -q2*x%d1val1
    1642            0 :       unary%d1val2 = -q2*x%d1val2
    1643            0 :       unary%d2val1 = q3*(-q5 + q7)
    1644            0 :       unary%d1val1_d1val2 = -q3*(q8*x%val - q9)
    1645            0 :       unary%d2val2 = q3*(-q10*x%val + q6*x%d2val2)
    1646            0 :       unary%d3val1 = q11*(q12*x%d3val1 - q14*pow3(x%d1val1) - q15*x%d1val1*(3.0_dp*x%d2val1*x%val + q4))
    1647              :       unary%d2val1_d1val2 = q11*(-q1*x%d1val2*x%val*(q5 - q7) &
    1648            0 :                           + q6*(2.0_dp*q0*q4*x%d1val2 + q15*x%d2val1_d1val2 - q6*x%d1val1*(q16*x%d1val1_d1val2 + q8)))
    1649            0 :       unary%d1val1_d2val2 = (-q15*x%d1val1_d2val2 + q16*q9*x%d1val2 + x%d1val1*(-q10*q13 + q6*(q10 + q17)))*powm1(pow5(sqrt(q1)))
    1650            0 :       unary%d3val2 = q11*(q12*x%d3val2 - q14*pow3(x%d1val2) - q15*x%d1val2*(3.0_dp*q17 + q10))
    1651            0 :    end function acos_self
    1652              : 
    1653       401954 :    function atan_self(x) result(unary)
    1654              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1655              :       type(auto_diff_real_2var_order3) :: unary
    1656       401954 :       real(dp) :: q17
    1657       401954 :       real(dp) :: q16
    1658       401954 :       real(dp) :: q15
    1659       401954 :       real(dp) :: q14
    1660       401954 :       real(dp) :: q13
    1661       401954 :       real(dp) :: q12
    1662       401954 :       real(dp) :: q11
    1663       401954 :       real(dp) :: q10
    1664       401954 :       real(dp) :: q9
    1665       401954 :       real(dp) :: q8
    1666       401954 :       real(dp) :: q7
    1667       401954 :       real(dp) :: q6
    1668       401954 :       real(dp) :: q5
    1669       401954 :       real(dp) :: q4
    1670              :       real(dp) :: q3
    1671       401954 :       real(dp) :: q2
    1672              :       real(dp) :: q1
    1673       401954 :       real(dp) :: q0
    1674       401954 :       q0 = pow2(x%val)
    1675       401954 :       q1 = q0 + 1
    1676       401954 :       q2 = powm1(q1)
    1677       401954 :       q3 = pow2(q1)
    1678       401954 :       q4 = powm1(q3)
    1679       401954 :       q5 = pow2(x%d1val1)
    1680       401954 :       q6 = 2.0_dp*x%val
    1681       401954 :       q7 = q5*q6
    1682       401954 :       q8 = q1*x%d2val1
    1683       401954 :       q9 = x%d1val1*x%d1val2
    1684       401954 :       q10 = q1*x%d1val1_d1val2
    1685       401954 :       q11 = pow2(x%d1val2)
    1686       401954 :       q12 = powm1(pow3(q1))
    1687       401954 :       q13 = 8.0_dp*q0
    1688       401954 :       q14 = 2.0_dp*x%d1val1
    1689       401954 :       q15 = q1*q14
    1690       401954 :       q16 = 4.0_dp*q0
    1691       401954 :       q17 = x%d2val2*x%val
    1692       401954 :       unary%val = atan(x%val)
    1693       401954 :       unary%d1val1 = q2*x%d1val1
    1694       401954 :       unary%d1val2 = q2*x%d1val2
    1695       401954 :       unary%d2val1 = q4*(-q7 + q8)
    1696       401954 :       unary%d1val1_d1val2 = q4*(q10 - q6*q9)
    1697       401954 :       unary%d2val2 = q4*(q1*x%d2val2 - q11*q6)
    1698       401954 :       unary%d3val1 = q12*(q13*pow3(x%d1val1) - q15*(3.0_dp*x%d2val1*x%val + q5) + q3*x%d3val1)
    1699       401954 :       unary%d2val1_d1val2 = q12*(-q15*(q6*x%d1val1_d1val2 + q9) + q16*q5*x%d1val2 + q3*x%d2val1_d1val2 + q6*x%d1val2*(q7 - q8))
    1700       401954 :       unary%d1val1_d2val2 = q12*(-4.0_dp*q10*x%d1val2*x%val - q14*(q1*(q11 + q17) - q11*q16) + q3*x%d1val1_d2val2)
    1701       401954 :       unary%d3val2 = q12*(-2.0_dp*q1*x%d1val2*(3.0_dp*q17 + q11) + q13*pow3(x%d1val2) + q3*x%d3val2)
    1702       401954 :    end function atan_self
    1703              : 
    1704            0 :    function asinpi_self(x) result(unary)
    1705              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1706              :       type(auto_diff_real_2var_order3) :: unary
    1707            0 :       real(dp) :: q18
    1708            0 :       real(dp) :: q17
    1709            0 :       real(dp) :: q16
    1710            0 :       real(dp) :: q15
    1711            0 :       real(dp) :: q14
    1712            0 :       real(dp) :: q13
    1713            0 :       real(dp) :: q12
    1714            0 :       real(dp) :: q11
    1715            0 :       real(dp) :: q10
    1716            0 :       real(dp) :: q9
    1717            0 :       real(dp) :: q8
    1718            0 :       real(dp) :: q7
    1719            0 :       real(dp) :: q6
    1720              :       real(dp) :: q5
    1721            0 :       real(dp) :: q4
    1722            0 :       real(dp) :: q3
    1723            0 :       real(dp) :: q2
    1724            0 :       real(dp) :: q1
    1725            0 :       real(dp) :: q0
    1726            0 :       q0 = powm1(pi)
    1727            0 :       q1 = pow2(x%val)
    1728            0 :       q2 = 1 - q1
    1729            0 :       q3 = q0*powm1(sqrt(q2))
    1730            0 :       q4 = pow2(x%d1val1)
    1731            0 :       q5 = q1 - 1
    1732            0 :       q6 = q0*powm1(pow3(sqrt(q2)))
    1733            0 :       q7 = x%d1val2*x%val
    1734            0 :       q8 = pow2(x%d1val2)
    1735            0 :       q9 = 3.0_dp*q1
    1736            0 :       q10 = pow2(q5)
    1737            0 :       q11 = q0*powm1(pow5(sqrt(q2)))
    1738            0 :       q12 = pow4(x%val)
    1739            0 :       q13 = 2.0_dp*q1
    1740            0 :       q14 = q4*x%d1val2
    1741            0 :       q15 = 2.0_dp*x%d1val1_d1val2
    1742            0 :       q16 = q15*x%d1val1
    1743            0 :       q17 = pow3(x%val)
    1744            0 :       q18 = x%d2val2*x%val
    1745            0 :       unary%val = q0*asin(x%val)
    1746            0 :       unary%d1val1 = q3*x%d1val1
    1747            0 :       unary%d1val2 = q3*x%d1val2
    1748            0 :       unary%d2val1 = q6*(q4*x%val - q5*x%d2val1)
    1749            0 :       unary%d1val1_d1val2 = q6*(q2*x%d1val1_d1val2 + q7*x%d1val1)
    1750            0 :       unary%d2val2 = q6*(-q5*x%d2val2 + q8*x%val)
    1751            0 :       unary%d3val1 = q11*(q10*x%d3val1 - q5*x%d1val1*(3.0_dp*x%d2val1*x%val + q4) + q9*pow3(x%d1val1))
    1752              :       unary%d2val1_d1val2 = q3*(q12*x%d2val1_d1val2 + q13*q14 - q13*x%d2val1_d1val2 + q14 &
    1753            0 :                                 - q16*q17 + q16*x%val - q17*x%d1val2*x%d2val1 + q7*x%d2val1 + x%d2val1_d1val2)*powm1(q12 - q13 + 1)
    1754            0 :       unary%d1val1_d2val2 = q11*(q10*x%d1val1_d2val2 - q15*q5*q7 - x%d1val1*(q5*(q18 + q8) - q8*q9))
    1755            0 :       unary%d3val2 = q11*(q10*x%d3val2 - q5*x%d1val2*(3.0_dp*q18 + q8) + q9*pow3(x%d1val2))
    1756            0 :    end function asinpi_self
    1757              : 
    1758            0 :    function acospi_self(x) result(unary)
    1759              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1760              :       type(auto_diff_real_2var_order3) :: unary
    1761            0 :       real(dp) :: q20
    1762            0 :       real(dp) :: q19
    1763            0 :       real(dp) :: q18
    1764            0 :       real(dp) :: q17
    1765            0 :       real(dp) :: q16
    1766            0 :       real(dp) :: q15
    1767            0 :       real(dp) :: q14
    1768            0 :       real(dp) :: q13
    1769            0 :       real(dp) :: q12
    1770            0 :       real(dp) :: q11
    1771            0 :       real(dp) :: q10
    1772            0 :       real(dp) :: q9
    1773            0 :       real(dp) :: q8
    1774            0 :       real(dp) :: q7
    1775            0 :       real(dp) :: q6
    1776              :       real(dp) :: q5
    1777            0 :       real(dp) :: q4
    1778            0 :       real(dp) :: q3
    1779            0 :       real(dp) :: q2
    1780            0 :       real(dp) :: q1
    1781            0 :       real(dp) :: q0
    1782            0 :       q0 = powm1(pi)
    1783            0 :       q1 = pow2(x%val)
    1784            0 :       q2 = 1 - q1
    1785            0 :       q3 = q0*powm1(sqrt(q2))
    1786            0 :       q4 = pow2(x%d1val1)
    1787            0 :       q5 = q1 - 1
    1788            0 :       q6 = q0*powm1(pow3(sqrt(q2)))
    1789            0 :       q7 = x%d1val2*x%val
    1790            0 :       q8 = q5*x%d1val1_d1val2
    1791            0 :       q9 = pow2(x%d1val2)
    1792            0 :       q10 = pow3(q5)
    1793            0 :       q11 = 3.0_dp*q1
    1794            0 :       q12 = q1*(3.0_dp - q11)
    1795            0 :       q13 = pow2(q5)
    1796            0 :       q14 = q0*powm1(pow7(sqrt(q2)))
    1797            0 :       q15 = pow4(x%val)
    1798            0 :       q16 = 2.0_dp*q1
    1799            0 :       q17 = 2.0_dp*x%d1val1*x%d1val1_d1val2
    1800            0 :       q18 = q4*x%d1val2
    1801            0 :       q19 = pow3(x%val)
    1802            0 :       q20 = x%d2val2*x%val
    1803            0 :       unary%val = q0*acos(x%val)
    1804            0 :       unary%d1val1 = -q3*x%d1val1
    1805            0 :       unary%d1val2 = -q3*x%d1val2
    1806            0 :       unary%d2val1 = q6*(-q4*x%val + q5*x%d2val1)
    1807            0 :       unary%d1val1_d1val2 = -q6*(q7*x%d1val1 - q8)
    1808            0 :       unary%d2val2 = q6*(q5*x%d2val2 - q9*x%val)
    1809            0 :       unary%d3val1 = q14*(q10*x%d3val1 - q12*pow3(x%d1val1) - q13*x%d1val1*(3.0_dp*x%d2val1*x%val + q4))
    1810              :       unary%d2val1_d1val2 = q3*(-q15*x%d2val1_d1val2 - q16*q18 + q16*x%d2val1_d1val2 + q17*q19 - q17*x%val &
    1811            0 :                                 - q18 + q19*x%d1val2*x%d2val1 - q7*x%d2val1 - x%d2val1_d1val2)*powm1(q15 - q16 + 1)
    1812            0 :       unary%d1val1_d2val2 = q0*(2.0_dp*q7*q8 - q13*x%d1val1_d2val2 + x%d1val1*(-q11*q9 + q5*(q20 + q9)))*powm1(pow5(sqrt(q2)))
    1813            0 :       unary%d3val2 = q14*(q10*x%d3val2 - q12*pow3(x%d1val2) - q13*x%d1val2*(3.0_dp*q20 + q9))
    1814            0 :    end function acospi_self
    1815              : 
    1816            0 :    function atanpi_self(x) result(unary)
    1817              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1818              :       type(auto_diff_real_2var_order3) :: unary
    1819            0 :       real(dp) :: q24
    1820            0 :       real(dp) :: q23
    1821            0 :       real(dp) :: q22
    1822            0 :       real(dp) :: q21
    1823            0 :       real(dp) :: q20
    1824            0 :       real(dp) :: q19
    1825            0 :       real(dp) :: q18
    1826            0 :       real(dp) :: q17
    1827            0 :       real(dp) :: q16
    1828            0 :       real(dp) :: q15
    1829            0 :       real(dp) :: q14
    1830            0 :       real(dp) :: q13
    1831            0 :       real(dp) :: q12
    1832            0 :       real(dp) :: q11
    1833            0 :       real(dp) :: q10
    1834            0 :       real(dp) :: q9
    1835            0 :       real(dp) :: q8
    1836            0 :       real(dp) :: q7
    1837            0 :       real(dp) :: q6
    1838            0 :       real(dp) :: q5
    1839            0 :       real(dp) :: q4
    1840            0 :       real(dp) :: q3
    1841            0 :       real(dp) :: q2
    1842            0 :       real(dp) :: q1
    1843            0 :       real(dp) :: q0
    1844            0 :       q0 = pow2(x%val)
    1845            0 :       q1 = pi*q0
    1846            0 :       q2 = powm1(pi + q1)
    1847            0 :       q3 = pow2(x%d1val1)
    1848            0 :       q4 = 2.0_dp*x%val
    1849            0 :       q5 = pow4(x%val)
    1850            0 :       q6 = pi*q5
    1851            0 :       q7 = powm1(2.0_dp*q1 + pi + q6)
    1852            0 :       q8 = q4*x%d1val2
    1853            0 :       q9 = pow2(x%d1val2)
    1854            0 :       q10 = powm1(3.0_dp*q1 + 3.0_dp*q6 + pi*pow6(x%val) + pi)
    1855            0 :       q11 = pow3(x%d1val1)
    1856            0 :       q12 = x%d1val1*x%val
    1857            0 :       q13 = 6.0_dp*x%d2val1
    1858            0 :       q14 = 2.0_dp*q0
    1859            0 :       q15 = pow3(x%val)
    1860            0 :       q16 = q15*x%d1val1
    1861            0 :       q17 = 6.0_dp*q0
    1862            0 :       q18 = 4.0_dp*x%d1val1_d1val2
    1863            0 :       q19 = 2.0_dp*x%d1val2
    1864            0 :       q20 = q18*x%d1val2
    1865            0 :       q21 = 2.0_dp*x%d1val1
    1866            0 :       q22 = q15*x%d2val2
    1867            0 :       q23 = pow3(x%d1val2)
    1868            0 :       q24 = 6.0_dp*x%d1val2
    1869            0 :       unary%val = powm1(pi)*atan(x%val)
    1870            0 :       unary%d1val1 = q2*x%d1val1
    1871            0 :       unary%d1val2 = q2*x%d1val2
    1872            0 :       unary%d2val1 = q7*(q0*x%d2val1 - q3*q4 + x%d2val1)
    1873            0 :       unary%d1val1_d1val2 = q7*(q0*x%d1val1_d1val2 - q8*x%d1val1 + x%d1val1_d1val2)
    1874            0 :       unary%d2val2 = q7*(q0*x%d2val2 - q4*q9 + x%d2val2)
    1875            0 :       unary%d3val1 = q10*(-2.0_dp*q11 + q11*q17 - q12*q13 - q13*q16 + q14*x%d3val1 + q5*x%d3val1 + x%d3val1)
    1876              :       unary%d2val1_d1val2 = q10 * &
    1877              :                             (-q12*q18 + q14*x%d2val1_d1val2 - q15*q19*x%d2val1 - q16*q18 &
    1878            0 :                               + q17*q3*x%d1val2 - q19*q3 + q5*x%d2val1_d1val2 - q8*x%d2val1 + x%d2val1_d1val2)
    1879              :       unary%d1val1_d2val2 = q10 * &
    1880              :                             (q14*x%d1val1_d2val2 - q15*q20 + q17*q9*x%d1val1 - q20*x%val &
    1881            0 :                               - q21*q22 - q21*q9 - q4*x%d1val1*x%d2val2 + q5*x%d1val1_d2val2 + x%d1val1_d2val2)
    1882            0 :       unary%d3val2 = q10*(-2.0_dp*q23 + q14*x%d3val2 + q17*q23 - q22*q24 - q24*x%d2val2*x%val + q5*x%d3val2 + x%d3val2)
    1883            0 :    end function atanpi_self
    1884              : 
    1885            0 :    function asinh_self(x) result(unary)
    1886              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1887              :       type(auto_diff_real_2var_order3) :: unary
    1888            0 :       real(dp) :: q15
    1889            0 :       real(dp) :: q14
    1890            0 :       real(dp) :: q13
    1891            0 :       real(dp) :: q12
    1892            0 :       real(dp) :: q11
    1893            0 :       real(dp) :: q10
    1894            0 :       real(dp) :: q9
    1895            0 :       real(dp) :: q8
    1896            0 :       real(dp) :: q7
    1897            0 :       real(dp) :: q6
    1898            0 :       real(dp) :: q5
    1899            0 :       real(dp) :: q4
    1900            0 :       real(dp) :: q3
    1901            0 :       real(dp) :: q2
    1902              :       real(dp) :: q1
    1903            0 :       real(dp) :: q0
    1904            0 :       q0 = pow2(x%val)
    1905            0 :       q1 = q0 + 1
    1906            0 :       q2 = powm1(sqrt(q1))
    1907            0 :       q3 = powm1(pow3(sqrt(q1)))
    1908            0 :       q4 = pow2(x%d1val1)
    1909            0 :       q5 = q4*x%val
    1910            0 :       q6 = q1*x%d2val1
    1911            0 :       q7 = x%d1val1*x%d1val2
    1912            0 :       q8 = q1*x%d1val1_d1val2
    1913            0 :       q9 = pow2(x%d1val2)
    1914            0 :       q10 = powm1(pow5(sqrt(q1)))
    1915            0 :       q11 = 3.0_dp*q0
    1916            0 :       q12 = pow2(q1)
    1917            0 :       q13 = q1*x%d1val1
    1918            0 :       q14 = x%d1val2*x%val
    1919            0 :       q15 = x%d2val2*x%val
    1920            0 :       unary%val = asinh(x%val)
    1921            0 :       unary%d1val1 = q2*x%d1val1
    1922            0 :       unary%d1val2 = q2*x%d1val2
    1923            0 :       unary%d2val1 = q3*(-q5 + q6)
    1924            0 :       unary%d1val1_d1val2 = q3*(-q7*x%val + q8)
    1925            0 :       unary%d2val2 = q3*(q1*x%d2val2 - q9*x%val)
    1926            0 :       unary%d3val1 = q10*(q11*pow3(x%d1val1) + q12*x%d3val1 - q13*(3.0_dp*x%d2val1*x%val + q4))
    1927              :       unary%d2val1_d1val2 = q10*(2.0_dp*q0*q4*x%d1val2 &
    1928            0 :                                  + q12*x%d2val1_d1val2 - q13*(2.0_dp*x%d1val1_d1val2*x%val + q7) + q14*(q5 - q6))
    1929            0 :       unary%d1val1_d2val2 = q10*(-2.0_dp*q14*q8 + q12*x%d1val1_d2val2 - x%d1val1*(q1*(q15 + q9) - q11*q9))
    1930            0 :       unary%d3val2 = q10*(-q1*x%d1val2*(3.0_dp*q15 + q9) + q11*pow3(x%d1val2) + q12*x%d3val2)
    1931            0 :    end function asinh_self
    1932              : 
    1933            0 :    function acosh_self(x) result(unary)
    1934              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1935              :       type(auto_diff_real_2var_order3) :: unary
    1936            0 :       real(dp) :: q15
    1937            0 :       real(dp) :: q14
    1938            0 :       real(dp) :: q13
    1939            0 :       real(dp) :: q12
    1940            0 :       real(dp) :: q11
    1941            0 :       real(dp) :: q10
    1942            0 :       real(dp) :: q9
    1943            0 :       real(dp) :: q8
    1944            0 :       real(dp) :: q7
    1945            0 :       real(dp) :: q6
    1946            0 :       real(dp) :: q5
    1947            0 :       real(dp) :: q4
    1948            0 :       real(dp) :: q3
    1949            0 :       real(dp) :: q2
    1950              :       real(dp) :: q1
    1951            0 :       real(dp) :: q0
    1952            0 :       q0 = pow2(x%val)
    1953            0 :       q1 = q0 - 1
    1954            0 :       q2 = powm1(sqrt(q1))
    1955            0 :       q3 = powm1(pow3(sqrt(q1)))
    1956            0 :       q4 = pow2(x%d1val1)
    1957            0 :       q5 = q4*x%val
    1958            0 :       q6 = q1*x%d2val1
    1959            0 :       q7 = x%d1val1*x%d1val2
    1960            0 :       q8 = q1*x%d1val1_d1val2
    1961            0 :       q9 = pow2(x%d1val2)
    1962            0 :       q10 = powm1(pow5(sqrt(q1)))
    1963            0 :       q11 = 3.0_dp*q0
    1964            0 :       q12 = pow2(q1)
    1965            0 :       q13 = q1*x%d1val1
    1966            0 :       q14 = x%d1val2*x%val
    1967            0 :       q15 = x%d2val2*x%val
    1968            0 :       unary%val = acosh(x%val)
    1969            0 :       unary%d1val1 = q2*x%d1val1
    1970            0 :       unary%d1val2 = q2*x%d1val2
    1971            0 :       unary%d2val1 = q3*(-q5 + q6)
    1972            0 :       unary%d1val1_d1val2 = q3*(-q7*x%val + q8)
    1973            0 :       unary%d2val2 = q3*(q1*x%d2val2 - q9*x%val)
    1974            0 :       unary%d3val1 = q10*(q11*pow3(x%d1val1) + q12*x%d3val1 - q13*(3.0_dp*x%d2val1*x%val + q4))
    1975              :       unary%d2val1_d1val2 = q10*(2.0_dp*q0*q4*x%d1val2 &
    1976            0 :                                  + q12*x%d2val1_d1val2 - q13*(2.0_dp*x%d1val1_d1val2*x%val + q7) + q14*(q5 - q6))
    1977            0 :       unary%d1val1_d2val2 = q10*(-2.0_dp*q14*q8 + q12*x%d1val1_d2val2 - x%d1val1*(q1*(q15 + q9) - q11*q9))
    1978            0 :       unary%d3val2 = q10*(-q1*x%d1val2*(3.0_dp*q15 + q9) + q11*pow3(x%d1val2) + q12*x%d3val2)
    1979            0 :    end function acosh_self
    1980              : 
    1981            0 :    function atanh_self(x) result(unary)
    1982              :       type(auto_diff_real_2var_order3), intent(in) :: x
    1983              :       type(auto_diff_real_2var_order3) :: unary
    1984            0 :       real(dp) :: q17
    1985            0 :       real(dp) :: q16
    1986            0 :       real(dp) :: q15
    1987            0 :       real(dp) :: q14
    1988            0 :       real(dp) :: q13
    1989              :       real(dp) :: q12
    1990            0 :       real(dp) :: q11
    1991            0 :       real(dp) :: q10
    1992            0 :       real(dp) :: q9
    1993            0 :       real(dp) :: q8
    1994            0 :       real(dp) :: q7
    1995            0 :       real(dp) :: q6
    1996            0 :       real(dp) :: q5
    1997            0 :       real(dp) :: q4
    1998              :       real(dp) :: q3
    1999            0 :       real(dp) :: q2
    2000              :       real(dp) :: q1
    2001            0 :       real(dp) :: q0
    2002            0 :       q0 = pow2(x%val)
    2003            0 :       q1 = q0 - 1
    2004            0 :       q2 = powm1(q1)
    2005            0 :       q3 = pow2(q1)
    2006            0 :       q4 = powm1(q3)
    2007            0 :       q5 = pow2(x%d1val1)
    2008            0 :       q6 = 2.0_dp*x%val
    2009            0 :       q7 = -q1*x%d2val1 + q5*q6
    2010            0 :       q8 = x%d1val1*x%d1val2
    2011            0 :       q9 = q1*x%d1val1_d1val2
    2012            0 :       q10 = pow2(x%d1val2)
    2013            0 :       q11 = powm1(pow4(q1))
    2014            0 :       q12 = pow3(q1)
    2015            0 :       q13 = 8.0_dp*q0*(1 - q0)
    2016            0 :       q14 = 2.0_dp*x%d1val1
    2017            0 :       q15 = powm1(q12)
    2018            0 :       q16 = 4.0_dp*q0
    2019            0 :       q17 = x%d2val2*x%val
    2020            0 :       unary%val = atanh(x%val)
    2021            0 :       unary%d1val1 = -q2*x%d1val1
    2022            0 :       unary%d1val2 = -q2*x%d1val2
    2023            0 :       unary%d2val1 = q4*q7
    2024            0 :       unary%d1val1_d1val2 = q4*(q6*q8 - q9)
    2025            0 :       unary%d2val2 = q4*(-q1*x%d2val2 + q10*q6)
    2026            0 :       unary%d3val1 = q11*(-q12*x%d3val1 + q13*pow3(x%d1val1) + q14*q3*(3.0_dp*x%d2val1*x%val + q5))
    2027            0 :       unary%d2val1_d1val2 = q15*(q1*q14*(q6*x%d1val1_d1val2 + q8) - q16*q5*x%d1val2 - q3*x%d2val1_d1val2 - q6*q7*x%d1val2)
    2028            0 :       unary%d1val1_d2val2 = q15*(4.0_dp*q9*x%d1val2*x%val + q14*(q1*(q10 + q17) - q10*q16) - q3*x%d1val1_d2val2)
    2029            0 :       unary%d3val2 = q11*(2.0_dp*q3*x%d1val2*(3.0_dp*q17 + q10) - q12*x%d3val2 + q13*pow3(x%d1val2))
    2030            0 :    end function atanh_self
    2031              : 
    2032      7067708 :    function sqrt_self(x) result(unary)
    2033              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2034              :       type(auto_diff_real_2var_order3) :: unary
    2035      7067708 :       real(dp) :: q12
    2036      7067708 :       real(dp) :: q11
    2037      7067708 :       real(dp) :: q10
    2038      7067708 :       real(dp) :: q9
    2039      7067708 :       real(dp) :: q8
    2040      7067708 :       real(dp) :: q7
    2041      7067708 :       real(dp) :: q6
    2042      7067708 :       real(dp) :: q5
    2043      7067708 :       real(dp) :: q4
    2044      7067708 :       real(dp) :: q3
    2045      7067708 :       real(dp) :: q2
    2046      7067708 :       real(dp) :: q1
    2047              :       real(dp) :: q0
    2048      7067708 :       q0 = sqrt(x%val)
    2049      7067708 :       q1 = 0.5_dp*powm1(q0)
    2050      7067708 :       q2 = 2.0_dp*x%val
    2051      7067708 :       q3 = q2*x%d2val1
    2052      7067708 :       q4 = pow2(x%d1val1)
    2053      7067708 :       q5 = 0.25_dp*powm1(pow3(sqrt(x%val)))
    2054      7067708 :       q6 = q2*x%d2val2
    2055      7067708 :       q7 = pow2(x%d1val2)
    2056      7067708 :       q8 = x%d1val1*x%val
    2057      7067708 :       q9 = 4.0_dp*pow2(x%val)
    2058      7067708 :       q10 = 0.125_dp*powm1(pow5(sqrt(x%val)))
    2059      7067708 :       q11 = 4.0_dp*x%d1val1_d1val2
    2060      7067708 :       q12 = x%d1val2*x%val
    2061      7067708 :       unary%val = q0
    2062      7067708 :       unary%d1val1 = q1*x%d1val1
    2063      7067708 :       unary%d1val2 = q1*x%d1val2
    2064      7067708 :       unary%d2val1 = q5*(q3 - q4)
    2065      7067708 :       unary%d1val1_d1val2 = q5*(q2*x%d1val1_d1val2 - x%d1val1*x%d1val2)
    2066      7067708 :       unary%d2val2 = q5*(q6 - q7)
    2067      7067708 :       unary%d3val1 = q10*(-6.0_dp*q8*x%d2val1 + 3.0_dp*pow3(x%d1val1) + q9*x%d3val1)
    2068      7067708 :       unary%d2val1_d1val2 = q10*(3.0_dp*q4*x%d1val2 - q11*q8 - q3*x%d1val2 + q9*x%d2val1_d1val2)
    2069      7067708 :       unary%d1val1_d2val2 = q10*(-q11*q12 + q9*x%d1val1_d2val2 + x%d1val1*(3.0_dp*q7 - q6))
    2070      7067708 :       unary%d3val2 = q10*(-6.0_dp*q12*x%d2val2 + 3.0_dp*pow3(x%d1val2) + q9*x%d3val2)
    2071      7067708 :    end function sqrt_self
    2072              : 
    2073      5998406 :    function pow2_self(x) result(unary)
    2074              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2075              :       type(auto_diff_real_2var_order3) :: unary
    2076      5998406 :       real(dp) :: q2
    2077      5998406 :       real(dp) :: q1
    2078      5998406 :       real(dp) :: q0
    2079      5998406 :       q0 = 2.0_dp*x%val
    2080      5998406 :       q1 = 2.0_dp*x%d1val2
    2081      5998406 :       q2 = 4.0_dp*x%d1val1_d1val2
    2082      5998406 :       unary%val = pow2(x%val)
    2083      5998406 :       unary%d1val1 = q0*x%d1val1
    2084      5998406 :       unary%d1val2 = q0*x%d1val2
    2085      5998406 :       unary%d2val1 = 2.0_dp*pow2(x%d1val1) + q0*x%d2val1
    2086      5998406 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2 + q1*x%d1val1
    2087      5998406 :       unary%d2val2 = 2.0_dp*pow2(x%d1val2) + q0*x%d2val2
    2088      5998406 :       unary%d3val1 = 6.0_dp*x%d1val1*x%d2val1 + q0*x%d3val1
    2089      5998406 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2 + q1*x%d2val1 + q2*x%d1val1
    2090      5998406 :       unary%d1val1_d2val2 = 2.0_dp*x%d1val1*x%d2val2 + q0*x%d1val1_d2val2 + q2*x%d1val2
    2091      5998406 :       unary%d3val2 = 6.0_dp*x%d1val2*x%d2val2 + q0*x%d3val2
    2092      5998406 :    end function pow2_self
    2093              : 
    2094      1911004 :    function pow3_self(x) result(unary)
    2095              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2096              :       type(auto_diff_real_2var_order3) :: unary
    2097      1911004 :       real(dp) :: q6
    2098      1911004 :       real(dp) :: q5
    2099      1911004 :       real(dp) :: q4
    2100      1911004 :       real(dp) :: q3
    2101      1911004 :       real(dp) :: q2
    2102      1911004 :       real(dp) :: q1
    2103      1911004 :       real(dp) :: q0
    2104      1911004 :       q0 = 3.0_dp*pow2(x%val)
    2105      1911004 :       q1 = x%d2val1*x%val
    2106      1911004 :       q2 = 2.0_dp*pow2(x%d1val1) + q1
    2107      1911004 :       q3 = 3.0_dp*x%val
    2108      1911004 :       q4 = x%d1val1_d1val2*x%val
    2109      1911004 :       q5 = x%d2val2*x%val
    2110      1911004 :       q6 = pow2(x%d1val2)
    2111      1911004 :       unary%val = pow3(x%val)
    2112      1911004 :       unary%d1val1 = q0*x%d1val1
    2113      1911004 :       unary%d1val2 = q0*x%d1val2
    2114      1911004 :       unary%d2val1 = q2*q3
    2115      1911004 :       unary%d1val1_d1val2 = q3*(2.0_dp*x%d1val1*x%d1val2 + q4)
    2116      1911004 :       unary%d2val2 = q3*(2.0_dp*q6 + q5)
    2117      1911004 :       unary%d3val1 = 18.0_dp*q1*x%d1val1 + 6.0_dp*pow3(x%d1val1) + q0*x%d3val1
    2118              :       unary%d2val1_d1val2 = 3.0_dp*q2*x%d1val2 &
    2119      1911004 :                             + q3*(4.0_dp*x%d1val1*x%d1val1_d1val2 + x%d1val2*x%d2val1 + x%d2val1_d1val2*x%val)
    2120      1911004 :       unary%d1val1_d2val2 = 12.0_dp*q4*x%d1val2 + 6.0_dp*x%d1val1*(q5 + q6) + q0*x%d1val1_d2val2
    2121      1911004 :       unary%d3val2 = 18.0_dp*q5*x%d1val2 + 6.0_dp*pow3(x%d1val2) + q0*x%d3val2
    2122      1911004 :    end function pow3_self
    2123              : 
    2124       136560 :    function pow4_self(x) result(unary)
    2125              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2126              :       type(auto_diff_real_2var_order3) :: unary
    2127       136560 :       real(dp) :: q9
    2128       136560 :       real(dp) :: q8
    2129       136560 :       real(dp) :: q7
    2130       136560 :       real(dp) :: q6
    2131       136560 :       real(dp) :: q5
    2132       136560 :       real(dp) :: q4
    2133       136560 :       real(dp) :: q3
    2134       136560 :       real(dp) :: q2
    2135       136560 :       real(dp) :: q1
    2136       136560 :       real(dp) :: q0
    2137       136560 :       q0 = 4.0_dp*pow3(x%val)
    2138       136560 :       q1 = x%d2val1*x%val
    2139       136560 :       q2 = 3.0_dp*pow2(x%d1val1) + q1
    2140       136560 :       q3 = pow2(x%val)
    2141       136560 :       q4 = 4.0_dp*q3
    2142       136560 :       q5 = x%d1val1_d1val2*x%val
    2143       136560 :       q6 = 3.0_dp*x%d1val1
    2144       136560 :       q7 = x%d2val2*x%val
    2145       136560 :       q8 = pow2(x%d1val2)
    2146       136560 :       q9 = 4.0_dp*x%val
    2147       136560 :       unary%val = pow4(x%val)
    2148       136560 :       unary%d1val1 = q0*x%d1val1
    2149       136560 :       unary%d1val2 = q0*x%d1val2
    2150       136560 :       unary%d2val1 = q2*q4
    2151       136560 :       unary%d1val1_d1val2 = q4*(q5 + q6*x%d1val2)
    2152       136560 :       unary%d2val2 = q4*(3.0_dp*q8 + q7)
    2153       136560 :       unary%d3val1 = q9*(6.0_dp*pow3(x%d1val1) + 9.0_dp*q1*x%d1val1 + q3*x%d3val1)
    2154              :       unary%d2val1_d1val2 = q9*(2.0_dp*q2*x%d1val2 &
    2155       136560 :                             + x%val*(6.0_dp*x%d1val1*x%d1val1_d1val2 + x%d1val2*x%d2val1 + x%d2val1_d1val2*x%val))
    2156       136560 :       unary%d1val1_d2val2 = q9*(6.0_dp*q5*x%d1val2 + q3*x%d1val1_d2val2 + q6*(2.0_dp*q8 + q7))
    2157       136560 :       unary%d3val2 = q9*(6.0_dp*pow3(x%d1val2) + 9.0_dp*q7*x%d1val2 + q3*x%d3val2)
    2158       136560 :    end function pow4_self
    2159              : 
    2160            0 :    function pow5_self(x) result(unary)
    2161              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2162              :       type(auto_diff_real_2var_order3) :: unary
    2163            0 :       real(dp) :: q9
    2164            0 :       real(dp) :: q8
    2165            0 :       real(dp) :: q7
    2166            0 :       real(dp) :: q6
    2167            0 :       real(dp) :: q5
    2168            0 :       real(dp) :: q4
    2169            0 :       real(dp) :: q3
    2170            0 :       real(dp) :: q2
    2171            0 :       real(dp) :: q1
    2172            0 :       real(dp) :: q0
    2173            0 :       q0 = 5.0_dp*pow4(x%val)
    2174            0 :       q1 = x%d2val1*x%val
    2175            0 :       q2 = 4.0_dp*pow2(x%d1val1) + q1
    2176            0 :       q3 = 5.0_dp*pow3(x%val)
    2177            0 :       q4 = x%d1val1_d1val2*x%val
    2178            0 :       q5 = 4.0_dp*x%d1val1
    2179            0 :       q6 = x%d2val2*x%val
    2180            0 :       q7 = pow2(x%d1val2)
    2181            0 :       q8 = pow2(x%val)
    2182            0 :       q9 = 5.0_dp*q8
    2183            0 :       unary%val = pow5(x%val)
    2184            0 :       unary%d1val1 = q0*x%d1val1
    2185            0 :       unary%d1val2 = q0*x%d1val2
    2186            0 :       unary%d2val1 = q2*q3
    2187            0 :       unary%d1val1_d1val2 = q3*(q4 + q5*x%d1val2)
    2188            0 :       unary%d2val2 = q3*(4.0_dp*q7 + q6)
    2189            0 :       unary%d3val1 = q9*(12.0_dp*q1*x%d1val1 + 12.0_dp*pow3(x%d1val1) + q8*x%d3val1)
    2190              :       unary%d2val1_d1val2 = q9*(3.0_dp*q2*x%d1val2 &
    2191            0 :                             + x%val*(8.0_dp*x%d1val1*x%d1val1_d1val2 + x%d1val2*x%d2val1 + x%d2val1_d1val2*x%val))
    2192            0 :       unary%d1val1_d2val2 = q9*(8.0_dp*q4*x%d1val2 + q5*(3.0_dp*q7 + q6) + q8*x%d1val1_d2val2)
    2193            0 :       unary%d3val2 = q9*(12.0_dp*q6*x%d1val2 + 12.0_dp*pow3(x%d1val2) + q8*x%d3val2)
    2194            0 :    end function pow5_self
    2195              : 
    2196            0 :    function pow6_self(x) result(unary)
    2197              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2198              :       type(auto_diff_real_2var_order3) :: unary
    2199            0 :       real(dp) :: q9
    2200            0 :       real(dp) :: q8
    2201            0 :       real(dp) :: q7
    2202            0 :       real(dp) :: q6
    2203            0 :       real(dp) :: q5
    2204            0 :       real(dp) :: q4
    2205            0 :       real(dp) :: q3
    2206            0 :       real(dp) :: q2
    2207            0 :       real(dp) :: q1
    2208            0 :       real(dp) :: q0
    2209            0 :       q0 = 6.0_dp*pow5(x%val)
    2210            0 :       q1 = x%d2val1*x%val
    2211            0 :       q2 = 5.0_dp*pow2(x%d1val1) + q1
    2212            0 :       q3 = 6.0_dp*pow4(x%val)
    2213            0 :       q4 = x%d1val1_d1val2*x%val
    2214            0 :       q5 = 5.0_dp*x%d1val1
    2215            0 :       q6 = x%d2val2*x%val
    2216            0 :       q7 = pow2(x%d1val2)
    2217            0 :       q8 = pow2(x%val)
    2218            0 :       q9 = 6.0_dp*pow3(x%val)
    2219            0 :       unary%val = pow6(x%val)
    2220            0 :       unary%d1val1 = q0*x%d1val1
    2221            0 :       unary%d1val2 = q0*x%d1val2
    2222            0 :       unary%d2val1 = q2*q3
    2223            0 :       unary%d1val1_d1val2 = q3*(q4 + q5*x%d1val2)
    2224            0 :       unary%d2val2 = q3*(5.0_dp*q7 + q6)
    2225            0 :       unary%d3val1 = q9*(15.0_dp*q1*x%d1val1 + 20.0_dp*pow3(x%d1val1) + q8*x%d3val1)
    2226              :       unary%d2val1_d1val2 = q9*(4.0_dp*q2*x%d1val2 + &
    2227            0 :                             x%val*(10.0_dp*x%d1val1*x%d1val1_d1val2 + x%d1val2*x%d2val1 + x%d2val1_d1val2*x%val))
    2228            0 :       unary%d1val1_d2val2 = q9*(10.0_dp*q4*x%d1val2 + q5*(4.0_dp*q7 + q6) + q8*x%d1val1_d2val2)
    2229            0 :       unary%d3val2 = q9*(15.0_dp*q6*x%d1val2 + 20.0_dp*pow3(x%d1val2) + q8*x%d3val2)
    2230            0 :    end function pow6_self
    2231              : 
    2232            0 :    function pow7_self(x) result(unary)
    2233              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2234              :       type(auto_diff_real_2var_order3) :: unary
    2235            0 :       real(dp) :: q9
    2236            0 :       real(dp) :: q8
    2237            0 :       real(dp) :: q7
    2238            0 :       real(dp) :: q6
    2239            0 :       real(dp) :: q5
    2240            0 :       real(dp) :: q4
    2241            0 :       real(dp) :: q3
    2242            0 :       real(dp) :: q2
    2243            0 :       real(dp) :: q1
    2244            0 :       real(dp) :: q0
    2245            0 :       q0 = 7.0_dp*pow6(x%val)
    2246            0 :       q1 = x%d2val1*x%val
    2247            0 :       q2 = 6.0_dp*pow2(x%d1val1) + q1
    2248            0 :       q3 = 7.0_dp*pow5(x%val)
    2249            0 :       q4 = x%d1val1_d1val2*x%val
    2250            0 :       q5 = 6.0_dp*x%d1val1
    2251            0 :       q6 = x%d2val2*x%val
    2252            0 :       q7 = pow2(x%d1val2)
    2253            0 :       q8 = pow2(x%val)
    2254            0 :       q9 = 7.0_dp*pow4(x%val)
    2255            0 :       unary%val = pow7(x%val)
    2256            0 :       unary%d1val1 = q0*x%d1val1
    2257            0 :       unary%d1val2 = q0*x%d1val2
    2258            0 :       unary%d2val1 = q2*q3
    2259            0 :       unary%d1val1_d1val2 = q3*(q4 + q5*x%d1val2)
    2260            0 :       unary%d2val2 = q3*(6.0_dp*q7 + q6)
    2261            0 :       unary%d3val1 = q9*(18.0_dp*q1*x%d1val1 + 30.0_dp*pow3(x%d1val1) + q8*x%d3val1)
    2262              :       unary%d2val1_d1val2 = q9*(5.0_dp*q2*x%d1val2 &
    2263            0 :                             + x%val*(12.0_dp*x%d1val1*x%d1val1_d1val2 + x%d1val2*x%d2val1 + x%d2val1_d1val2*x%val))
    2264            0 :       unary%d1val1_d2val2 = q9*(12.0_dp*q4*x%d1val2 + q5*(5.0_dp*q7 + q6) + q8*x%d1val1_d2val2)
    2265            0 :       unary%d3val2 = q9*(18.0_dp*q6*x%d1val2 + 30.0_dp*pow3(x%d1val2) + q8*x%d3val2)
    2266            0 :    end function pow7_self
    2267              : 
    2268            0 :    function pow8_self(x) result(unary)
    2269              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2270              :       type(auto_diff_real_2var_order3) :: unary
    2271            0 :       real(dp) :: q9
    2272            0 :       real(dp) :: q8
    2273            0 :       real(dp) :: q7
    2274            0 :       real(dp) :: q6
    2275            0 :       real(dp) :: q5
    2276            0 :       real(dp) :: q4
    2277            0 :       real(dp) :: q3
    2278            0 :       real(dp) :: q2
    2279            0 :       real(dp) :: q1
    2280            0 :       real(dp) :: q0
    2281            0 :       q0 = 8.0_dp*pow7(x%val)
    2282            0 :       q1 = x%d2val1*x%val
    2283            0 :       q2 = 7.0_dp*pow2(x%d1val1) + q1
    2284            0 :       q3 = 8.0_dp*pow6(x%val)
    2285            0 :       q4 = x%d1val1_d1val2*x%val
    2286            0 :       q5 = 7.0_dp*x%d1val1
    2287            0 :       q6 = x%d2val2*x%val
    2288            0 :       q7 = pow2(x%d1val2)
    2289            0 :       q8 = pow2(x%val)
    2290            0 :       q9 = 8.0_dp*pow5(x%val)
    2291            0 :       unary%val = pow8(x%val)
    2292            0 :       unary%d1val1 = q0*x%d1val1
    2293            0 :       unary%d1val2 = q0*x%d1val2
    2294            0 :       unary%d2val1 = q2*q3
    2295            0 :       unary%d1val1_d1val2 = q3*(q4 + q5*x%d1val2)
    2296            0 :       unary%d2val2 = q3*(7.0_dp*q7 + q6)
    2297            0 :       unary%d3val1 = q9*(21.0_dp*q1*x%d1val1 + 42.0_dp*pow3(x%d1val1) + q8*x%d3val1)
    2298              :       unary%d2val1_d1val2 = q9*(6.0_dp*q2*x%d1val2 &
    2299            0 :                             + x%val*(14.0_dp*x%d1val1*x%d1val1_d1val2 + x%d1val2*x%d2val1 + x%d2val1_d1val2*x%val))
    2300            0 :       unary%d1val1_d2val2 = q9*(14.0_dp*q4*x%d1val2 + q5*(6.0_dp*q7 + q6) + q8*x%d1val1_d2val2)
    2301            0 :       unary%d3val2 = q9*(21.0_dp*q6*x%d1val2 + 42.0_dp*pow3(x%d1val2) + q8*x%d3val2)
    2302            0 :    end function pow8_self
    2303              : 
    2304        45520 :    function abs_self(x) result(unary)
    2305              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2306              :       type(auto_diff_real_2var_order3) :: unary
    2307        45520 :       real(dp) :: q0
    2308        45520 :       q0 = sgn(x%val)
    2309        45520 :       unary%val = Abs(x%val)
    2310        45520 :       unary%d1val1 = q0*x%d1val1
    2311        45520 :       unary%d1val2 = q0*x%d1val2
    2312        45520 :       unary%d2val1 = q0*x%d2val1
    2313        45520 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    2314        45520 :       unary%d2val2 = q0*x%d2val2
    2315        45520 :       unary%d3val1 = q0*x%d3val1
    2316        45520 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    2317        45520 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    2318        45520 :       unary%d3val2 = q0*x%d3val2
    2319        45520 :    end function abs_self
    2320              : 
    2321     11856962 :    function add_self(x, y) result(binary)
    2322              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2323              :       type(auto_diff_real_2var_order3), intent(in) :: y
    2324              :       type(auto_diff_real_2var_order3) :: binary
    2325     11856962 :       binary%val = x%val + y%val
    2326     11856962 :       binary%d1val1 = x%d1val1 + y%d1val1
    2327     11856962 :       binary%d1val2 = x%d1val2 + y%d1val2
    2328     11856962 :       binary%d2val1 = x%d2val1 + y%d2val1
    2329     11856962 :       binary%d1val1_d1val2 = x%d1val1_d1val2 + y%d1val1_d1val2
    2330     11856962 :       binary%d2val2 = x%d2val2 + y%d2val2
    2331     11856962 :       binary%d3val1 = x%d3val1 + y%d3val1
    2332     11856962 :       binary%d2val1_d1val2 = x%d2val1_d1val2 + y%d2val1_d1val2
    2333     11856962 :       binary%d1val1_d2val2 = x%d1val1_d2val2 + y%d1val1_d2val2
    2334     11856962 :       binary%d3val2 = x%d3val2 + y%d3val2
    2335     11856962 :    end function add_self
    2336              : 
    2337       447474 :    function add_self_real(x, y) result(unary)
    2338              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2339              :       real(dp), intent(in) :: y
    2340              :       type(auto_diff_real_2var_order3) :: unary
    2341       447474 :       unary%val = x%val + y
    2342       447474 :       unary%d1val1 = x%d1val1
    2343       447474 :       unary%d1val2 = x%d1val2
    2344       447474 :       unary%d2val1 = x%d2val1
    2345       447474 :       unary%d1val1_d1val2 = x%d1val1_d1val2
    2346       447474 :       unary%d2val2 = x%d2val2
    2347       447474 :       unary%d3val1 = x%d3val1
    2348       447474 :       unary%d2val1_d1val2 = x%d2val1_d1val2
    2349       447474 :       unary%d1val1_d2val2 = x%d1val1_d2val2
    2350       447474 :       unary%d3val2 = x%d3val2
    2351       447474 :    end function add_self_real
    2352              : 
    2353     14271160 :    function add_real_self(z, x) result(unary)
    2354              :       real(dp), intent(in) :: z
    2355              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2356              :       type(auto_diff_real_2var_order3) :: unary
    2357     14271160 :       unary%val = x%val + z
    2358     14271160 :       unary%d1val1 = x%d1val1
    2359     14271160 :       unary%d1val2 = x%d1val2
    2360     14271160 :       unary%d2val1 = x%d2val1
    2361     14271160 :       unary%d1val1_d1val2 = x%d1val1_d1val2
    2362     14271160 :       unary%d2val2 = x%d2val2
    2363     14271160 :       unary%d3val1 = x%d3val1
    2364     14271160 :       unary%d2val1_d1val2 = x%d2val1_d1val2
    2365     14271160 :       unary%d1val1_d2val2 = x%d1val1_d2val2
    2366     14271160 :       unary%d3val2 = x%d3val2
    2367     14271160 :    end function add_real_self
    2368              : 
    2369            0 :    function add_self_int(x, y) result(unary)
    2370              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2371              :       integer, intent(in) :: y
    2372              :       type(auto_diff_real_2var_order3) :: unary
    2373            0 :       real(dp) :: y_dp
    2374            0 :       y_dp = y
    2375            0 :       unary%val = x%val + y_dp
    2376            0 :       unary%d1val1 = x%d1val1
    2377            0 :       unary%d1val2 = x%d1val2
    2378            0 :       unary%d2val1 = x%d2val1
    2379            0 :       unary%d1val1_d1val2 = x%d1val1_d1val2
    2380            0 :       unary%d2val2 = x%d2val2
    2381            0 :       unary%d3val1 = x%d3val1
    2382            0 :       unary%d2val1_d1val2 = x%d2val1_d1val2
    2383            0 :       unary%d1val1_d2val2 = x%d1val1_d2val2
    2384            0 :       unary%d3val2 = x%d3val2
    2385            0 :    end function add_self_int
    2386              : 
    2387       310914 :    function add_int_self(z, x) result(unary)
    2388              :       integer, intent(in) :: z
    2389              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2390              :       type(auto_diff_real_2var_order3) :: unary
    2391       310914 :       real(dp) :: y_dp
    2392       310914 :       y_dp = z
    2393       310914 :       unary%val = x%val + y_dp
    2394       310914 :       unary%d1val1 = x%d1val1
    2395       310914 :       unary%d1val2 = x%d1val2
    2396       310914 :       unary%d2val1 = x%d2val1
    2397       310914 :       unary%d1val1_d1val2 = x%d1val1_d1val2
    2398       310914 :       unary%d2val2 = x%d2val2
    2399       310914 :       unary%d3val1 = x%d3val1
    2400       310914 :       unary%d2val1_d1val2 = x%d2val1_d1val2
    2401       310914 :       unary%d1val1_d2val2 = x%d1val1_d2val2
    2402       310914 :       unary%d3val2 = x%d3val2
    2403       310914 :    end function add_int_self
    2404              : 
    2405      2586078 :    function sub_self(x, y) result(binary)
    2406              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2407              :       type(auto_diff_real_2var_order3), intent(in) :: y
    2408              :       type(auto_diff_real_2var_order3) :: binary
    2409      2586078 :       binary%val = x%val - y%val
    2410      2586078 :       binary%d1val1 = x%d1val1 - y%d1val1
    2411      2586078 :       binary%d1val2 = x%d1val2 - y%d1val2
    2412      2586078 :       binary%d2val1 = x%d2val1 - y%d2val1
    2413      2586078 :       binary%d1val1_d1val2 = x%d1val1_d1val2 - y%d1val1_d1val2
    2414      2586078 :       binary%d2val2 = x%d2val2 - y%d2val2
    2415      2586078 :       binary%d3val1 = x%d3val1 - y%d3val1
    2416      2586078 :       binary%d2val1_d1val2 = x%d2val1_d1val2 - y%d2val1_d1val2
    2417      2586078 :       binary%d1val1_d2val2 = x%d1val1_d2val2 - y%d1val1_d2val2
    2418      2586078 :       binary%d3val2 = x%d3val2 - y%d3val2
    2419      2586078 :    end function sub_self
    2420              : 
    2421       803500 :    function sub_self_real(x, y) result(unary)
    2422              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2423              :       real(dp), intent(in) :: y
    2424              :       type(auto_diff_real_2var_order3) :: unary
    2425       803500 :       unary%val = x%val - y
    2426       803500 :       unary%d1val1 = x%d1val1
    2427       803500 :       unary%d1val2 = x%d1val2
    2428       803500 :       unary%d2val1 = x%d2val1
    2429       803500 :       unary%d1val1_d1val2 = x%d1val1_d1val2
    2430       803500 :       unary%d2val2 = x%d2val2
    2431       803500 :       unary%d3val1 = x%d3val1
    2432       803500 :       unary%d2val1_d1val2 = x%d2val1_d1val2
    2433       803500 :       unary%d1val1_d2val2 = x%d1val1_d2val2
    2434       803500 :       unary%d3val2 = x%d3val2
    2435       803500 :    end function sub_self_real
    2436              : 
    2437      2047156 :    function sub_real_self(z, x) result(unary)
    2438              :       real(dp), intent(in) :: z
    2439              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2440              :       type(auto_diff_real_2var_order3) :: unary
    2441      2047156 :       unary%val = -x%val + z
    2442      2047156 :       unary%d1val1 = -x%d1val1
    2443      2047156 :       unary%d1val2 = -x%d1val2
    2444      2047156 :       unary%d2val1 = -x%d2val1
    2445      2047156 :       unary%d1val1_d1val2 = -x%d1val1_d1val2
    2446      2047156 :       unary%d2val2 = -x%d2val2
    2447      2047156 :       unary%d3val1 = -x%d3val1
    2448      2047156 :       unary%d2val1_d1val2 = -x%d2val1_d1val2
    2449      2047156 :       unary%d1val1_d2val2 = -x%d1val1_d2val2
    2450      2047156 :       unary%d3val2 = -x%d3val2
    2451      2047156 :    end function sub_real_self
    2452              : 
    2453            0 :    function sub_self_int(x, y) result(unary)
    2454              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2455              :       integer, intent(in) :: y
    2456              :       type(auto_diff_real_2var_order3) :: unary
    2457            0 :       real(dp) :: y_dp
    2458            0 :       y_dp = y
    2459            0 :       unary%val = x%val - y_dp
    2460            0 :       unary%d1val1 = x%d1val1
    2461            0 :       unary%d1val2 = x%d1val2
    2462            0 :       unary%d2val1 = x%d2val1
    2463            0 :       unary%d1val1_d1val2 = x%d1val1_d1val2
    2464            0 :       unary%d2val2 = x%d2val2
    2465            0 :       unary%d3val1 = x%d3val1
    2466            0 :       unary%d2val1_d1val2 = x%d2val1_d1val2
    2467            0 :       unary%d1val1_d2val2 = x%d1val1_d2val2
    2468            0 :       unary%d3val2 = x%d3val2
    2469            0 :    end function sub_self_int
    2470              : 
    2471            0 :    function sub_int_self(z, x) result(unary)
    2472              :       integer, intent(in) :: z
    2473              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2474              :       type(auto_diff_real_2var_order3) :: unary
    2475            0 :       real(dp) :: y_dp
    2476            0 :       y_dp = z
    2477            0 :       unary%val = -x%val + y_dp
    2478            0 :       unary%d1val1 = -x%d1val1
    2479            0 :       unary%d1val2 = -x%d1val2
    2480            0 :       unary%d2val1 = -x%d2val1
    2481            0 :       unary%d1val1_d1val2 = -x%d1val1_d1val2
    2482            0 :       unary%d2val2 = -x%d2val2
    2483            0 :       unary%d3val1 = -x%d3val1
    2484            0 :       unary%d2val1_d1val2 = -x%d2val1_d1val2
    2485            0 :       unary%d1val1_d2val2 = -x%d1val1_d2val2
    2486            0 :       unary%d3val2 = -x%d3val2
    2487            0 :    end function sub_int_self
    2488              : 
    2489     15066954 :    function mul_self(x, y) result(binary)
    2490              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2491              :       type(auto_diff_real_2var_order3), intent(in) :: y
    2492              :       type(auto_diff_real_2var_order3) :: binary
    2493     15066954 :       real(dp) :: q1
    2494     15066954 :       real(dp) :: q0
    2495     15066954 :       q0 = 2.0_dp*x%d1val1
    2496     15066954 :       q1 = 2.0_dp*y%d1val2
    2497     15066954 :       binary%val = x%val*y%val
    2498     15066954 :       binary%d1val1 = x%d1val1*y%val + x%val*y%d1val1
    2499     15066954 :       binary%d1val2 = x%d1val2*y%val + x%val*y%d1val2
    2500     15066954 :       binary%d2val1 = q0*y%d1val1 + x%d2val1*y%val + x%val*y%d2val1
    2501     15066954 :       binary%d1val1_d1val2 = x%d1val1*y%d1val2 + x%d1val1_d1val2*y%val + x%d1val2*y%d1val1 + x%val*y%d1val1_d1val2
    2502     15066954 :       binary%d2val2 = q1*x%d1val2 + x%d2val2*y%val + x%val*y%d2val2
    2503     15066954 :       binary%d3val1 = 3.0_dp*x%d1val1*y%d2val1 + 3.0_dp*x%d2val1*y%d1val1 + x%d3val1*y%val + x%val*y%d3val1
    2504              :       binary%d2val1_d1val2 = 2.0_dp*x%d1val1_d1val2*y%d1val1 + q0*y%d1val1_d1val2 &
    2505     15066954 :                              + x%d1val2*y%d2val1 + x%d2val1*y%d1val2 + x%d2val1_d1val2*y%val + x%val*y%d2val1_d1val2
    2506              :       binary%d1val1_d2val2 = 2.0_dp*x%d1val2*y%d1val1_d1val2 + q1*x%d1val1_d1val2 &
    2507     15066954 :                              + x%d1val1*y%d2val2 + x%d1val1_d2val2*y%val + x%d2val2*y%d1val1 + x%val*y%d1val1_d2val2
    2508     15066954 :       binary%d3val2 = 3.0_dp*x%d1val2*y%d2val2 + 3.0_dp*x%d2val2*y%d1val2 + x%d3val2*y%val + x%val*y%d3val2
    2509     15066954 :    end function mul_self
    2510              : 
    2511      5880898 :    function mul_self_real(x, y) result(unary)
    2512              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2513              :       real(dp), intent(in) :: y
    2514              :       type(auto_diff_real_2var_order3) :: unary
    2515      5880898 :       unary%val = x%val*y
    2516      5880898 :       unary%d1val1 = x%d1val1*y
    2517      5880898 :       unary%d1val2 = x%d1val2*y
    2518      5880898 :       unary%d2val1 = x%d2val1*y
    2519      5880898 :       unary%d1val1_d1val2 = x%d1val1_d1val2*y
    2520      5880898 :       unary%d2val2 = x%d2val2*y
    2521      5880898 :       unary%d3val1 = x%d3val1*y
    2522      5880898 :       unary%d2val1_d1val2 = x%d2val1_d1val2*y
    2523      5880898 :       unary%d1val1_d2val2 = x%d1val1_d2val2*y
    2524      5880898 :       unary%d3val2 = x%d3val2*y
    2525      5880898 :    end function mul_self_real
    2526              : 
    2527     21419300 :    function mul_real_self(z, x) result(unary)
    2528              :       real(dp), intent(in) :: z
    2529              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2530              :       type(auto_diff_real_2var_order3) :: unary
    2531     21419300 :       unary%val = x%val*z
    2532     21419300 :       unary%d1val1 = x%d1val1*z
    2533     21419300 :       unary%d1val2 = x%d1val2*z
    2534     21419300 :       unary%d2val1 = x%d2val1*z
    2535     21419300 :       unary%d1val1_d1val2 = x%d1val1_d1val2*z
    2536     21419300 :       unary%d2val2 = x%d2val2*z
    2537     21419300 :       unary%d3val1 = x%d3val1*z
    2538     21419300 :       unary%d2val1_d1val2 = x%d2val1_d1val2*z
    2539     21419300 :       unary%d1val1_d2val2 = x%d1val1_d2val2*z
    2540     21419300 :       unary%d3val2 = x%d3val2*z
    2541     21419300 :    end function mul_real_self
    2542              : 
    2543            0 :    function mul_self_int(x, y) result(unary)
    2544              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2545              :       integer, intent(in) :: y
    2546              :       type(auto_diff_real_2var_order3) :: unary
    2547            0 :       real(dp) :: y_dp
    2548            0 :       y_dp = y
    2549            0 :       unary%val = x%val*y_dp
    2550            0 :       unary%d1val1 = x%d1val1*y_dp
    2551            0 :       unary%d1val2 = x%d1val2*y_dp
    2552            0 :       unary%d2val1 = x%d2val1*y_dp
    2553            0 :       unary%d1val1_d1val2 = x%d1val1_d1val2*y_dp
    2554            0 :       unary%d2val2 = x%d2val2*y_dp
    2555            0 :       unary%d3val1 = x%d3val1*y_dp
    2556            0 :       unary%d2val1_d1val2 = x%d2val1_d1val2*y_dp
    2557            0 :       unary%d1val1_d2val2 = x%d1val1_d2val2*y_dp
    2558            0 :       unary%d3val2 = x%d3val2*y_dp
    2559            0 :    end function mul_self_int
    2560              : 
    2561            0 :    function mul_int_self(z, x) result(unary)
    2562              :       integer, intent(in) :: z
    2563              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2564              :       type(auto_diff_real_2var_order3) :: unary
    2565            0 :       real(dp) :: y_dp
    2566            0 :       y_dp = z
    2567            0 :       unary%val = x%val*y_dp
    2568            0 :       unary%d1val1 = x%d1val1*y_dp
    2569            0 :       unary%d1val2 = x%d1val2*y_dp
    2570            0 :       unary%d2val1 = x%d2val1*y_dp
    2571            0 :       unary%d1val1_d1val2 = x%d1val1_d1val2*y_dp
    2572            0 :       unary%d2val2 = x%d2val2*y_dp
    2573            0 :       unary%d3val1 = x%d3val1*y_dp
    2574            0 :       unary%d2val1_d1val2 = x%d2val1_d1val2*y_dp
    2575            0 :       unary%d1val1_d2val2 = x%d1val1_d2val2*y_dp
    2576            0 :       unary%d3val2 = x%d3val2*y_dp
    2577            0 :    end function mul_int_self
    2578              : 
    2579      9493216 :    function div_self(x, y) result(binary)
    2580              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2581              :       type(auto_diff_real_2var_order3), intent(in) :: y
    2582              :       type(auto_diff_real_2var_order3) :: binary
    2583      9493216 :       real(dp) :: q22
    2584      9493216 :       real(dp) :: q21
    2585      9493216 :       real(dp) :: q20
    2586      9493216 :       real(dp) :: q19
    2587      9493216 :       real(dp) :: q18
    2588      9493216 :       real(dp) :: q17
    2589      9493216 :       real(dp) :: q16
    2590      9493216 :       real(dp) :: q15
    2591      9493216 :       real(dp) :: q14
    2592      9493216 :       real(dp) :: q13
    2593      9493216 :       real(dp) :: q12
    2594      9493216 :       real(dp) :: q11
    2595      9493216 :       real(dp) :: q10
    2596      9493216 :       real(dp) :: q9
    2597      9493216 :       real(dp) :: q8
    2598      9493216 :       real(dp) :: q7
    2599              :       real(dp) :: q6
    2600      9493216 :       real(dp) :: q5
    2601      9493216 :       real(dp) :: q4
    2602      9493216 :       real(dp) :: q3
    2603      9493216 :       real(dp) :: q2
    2604      9493216 :       real(dp) :: q1
    2605              :       real(dp) :: q0
    2606      9493216 :       q0 = pow2(y%val)
    2607      9493216 :       q1 = powm1(q0)
    2608      9493216 :       q2 = x%d1val1*y%val
    2609      9493216 :       q3 = x%val*y%d1val1
    2610      9493216 :       q4 = x%d1val2*y%val
    2611      9493216 :       q5 = x%val*y%d1val2
    2612      9493216 :       q6 = pow3(y%val)
    2613      9493216 :       q7 = powm1(q6)
    2614      9493216 :       q8 = q0*x%d2val1
    2615      9493216 :       q9 = 2.0_dp*y%d1val1
    2616      9493216 :       q10 = y%d2val1*y%val
    2617      9493216 :       q11 = pow2(y%d1val1)
    2618      9493216 :       q12 = 2.0_dp*q11
    2619      9493216 :       q13 = -q10 + q12
    2620      9493216 :       q14 = q0*x%d1val1_d1val2
    2621      9493216 :       q15 = 2.0_dp*y%d1val2
    2622      9493216 :       q16 = x%d1val2*y%d1val1
    2623      9493216 :       q17 = q0*x%d2val2
    2624      9493216 :       q18 = y%d2val2*y%val
    2625      9493216 :       q19 = pow2(y%d1val2)
    2626      9493216 :       q20 = 2.0_dp*q19 - q18
    2627      9493216 :       q21 = powm1(pow4(y%val))
    2628      9493216 :       q22 = 2.0_dp*y%d1val1_d1val2
    2629      9493216 :       binary%val = x%val*powm1(y%val)
    2630      9493216 :       binary%d1val1 = q1*(q2 - q3)
    2631      9493216 :       binary%d1val2 = q1*(q4 - q5)
    2632      9493216 :       binary%d2val1 = q7*(q13*x%val - q2*q9 + q8)
    2633      9493216 :       binary%d1val1_d1val2 = q7*(q14 + q15*q3 - y%val*(q16 + x%d1val1*y%d1val2 + x%val*y%d1val1_d1val2))
    2634      9493216 :       binary%d2val2 = q7*(-q15*q4 + q17 + q20*x%val)
    2635              :       binary%d3val1 = q21*(-3.0_dp*q8*y%d1val1 + 3.0_dp*q13*q2 + q6*x%d3val1 &
    2636      9493216 :                            - x%val*(-6.0_dp*q10*y%d1val1 + 6.0_dp*pow3(y%d1val1) + q0*y%d3val1))
    2637              :       binary%d2val1_d1val2 = q21*(-6.0_dp*q11*q5 + 2.0_dp*q10*q5 + 4.0_dp*q2*y%d1val1*y%d1val2 &
    2638              :                            + 4.0_dp*q3*y%d1val1_d1val2*y%val - q0*q22*x%d1val1 &
    2639      9493216 :                            - q0*x%d1val2*y%d2val1 - q0*x%val*y%d2val1_d1val2 + q12*q4 - q14*q9 + q6*x%d2val1_d1val2 - q8*y%d1val2)
    2640              :       binary%d1val1_d2val2 = q21*(-6.0_dp*q19*q3 + 2.0_dp*y%val*(q15*q16 + q19*x%d1val1 + q22*q5 + q3*y%d2val2) &
    2641              :                            - q0*(q15*x%d1val1_d1val2 + q22*x%d1val2 &
    2642              :                                  + x%d1val1*y%d2val2 + x%d2val2*y%d1val1 + x%val*y%d1val1_d2val2) &
    2643      9493216 :                            + q6*x%d1val1_d2val2)
    2644              :       binary%d3val2 = q21*(-3.0_dp*q17*y%d1val2 + 3.0_dp*q20*q4 &
    2645      9493216 :                       + q6*x%d3val2 - x%val*(-6.0_dp*q18*y%d1val2 + 6.0_dp*pow3(y%d1val2) + q0*y%d3val2))
    2646      9493216 :    end function div_self
    2647              : 
    2648      3473300 :    function div_self_real(x, y) result(unary)
    2649              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2650              :       real(dp), intent(in) :: y
    2651              :       type(auto_diff_real_2var_order3) :: unary
    2652      3473300 :       real(dp) :: q0
    2653      3473300 :       q0 = powm1(y)
    2654      3473300 :       unary%val = q0*x%val
    2655      3473300 :       unary%d1val1 = q0*x%d1val1
    2656      3473300 :       unary%d1val2 = q0*x%d1val2
    2657      3473300 :       unary%d2val1 = q0*x%d2val1
    2658      3473300 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    2659      3473300 :       unary%d2val2 = q0*x%d2val2
    2660      3473300 :       unary%d3val1 = q0*x%d3val1
    2661      3473300 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    2662      3473300 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    2663      3473300 :       unary%d3val2 = q0*x%d3val2
    2664      3473300 :    end function div_self_real
    2665              : 
    2666      4806700 :    function div_real_self(z, x) result(unary)
    2667              :       real(dp), intent(in) :: z
    2668              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2669              :       type(auto_diff_real_2var_order3) :: unary
    2670      4806700 :       real(dp) :: q12
    2671      4806700 :       real(dp) :: q11
    2672      4806700 :       real(dp) :: q10
    2673      4806700 :       real(dp) :: q9
    2674      4806700 :       real(dp) :: q8
    2675      4806700 :       real(dp) :: q7
    2676      4806700 :       real(dp) :: q6
    2677      4806700 :       real(dp) :: q5
    2678      4806700 :       real(dp) :: q4
    2679      4806700 :       real(dp) :: q3
    2680      4806700 :       real(dp) :: q2
    2681      4806700 :       real(dp) :: q1
    2682              :       real(dp) :: q0
    2683      4806700 :       q0 = pow2(x%val)
    2684      4806700 :       q1 = z*powm1(q0)
    2685      4806700 :       q2 = x%d2val1*x%val
    2686      4806700 :       q3 = pow2(x%d1val1)
    2687      4806700 :       q4 = z*powm1(pow3(x%val))
    2688      4806700 :       q5 = 2.0_dp*x%d1val1
    2689      4806700 :       q6 = x%d1val1_d1val2*x%val
    2690      4806700 :       q7 = x%d2val2*x%val
    2691      4806700 :       q8 = -q7
    2692      4806700 :       q9 = pow2(x%d1val2)
    2693      4806700 :       q10 = z*powm1(pow4(x%val))
    2694      4806700 :       q11 = 4.0_dp*q6
    2695      4806700 :       q12 = 6.0_dp*x%d1val2
    2696      4806700 :       unary%val = z*powm1(x%val)
    2697      4806700 :       unary%d1val1 = -q1*x%d1val1
    2698      4806700 :       unary%d1val2 = -q1*x%d1val2
    2699      4806700 :       unary%d2val1 = q4*(2.0_dp*q3 - q2)
    2700      4806700 :       unary%d1val1_d1val2 = q4*(q5*x%d1val2 - q6)
    2701      4806700 :       unary%d2val2 = q4*(2.0_dp*q9 + q8)
    2702      4806700 :       unary%d3val1 = q10*(-6.0_dp*pow3(x%d1val1) + 6.0_dp*q2*x%d1val1 - q0*x%d3val1)
    2703      4806700 :       unary%d2val1_d1val2 = q10*(2.0_dp*q2*x%d1val2 - q0*x%d2val1_d1val2 + q11*x%d1val1 - q12*q3)
    2704      4806700 :       unary%d1val1_d2val2 = -q10*(q0*x%d1val1_d2val2 - q11*x%d1val2 + q5*(3.0_dp*q9 + q8))
    2705      4806700 :       unary%d3val2 = q10*(-6.0_dp*pow3(x%d1val2) - q0*x%d3val2 + q12*q7)
    2706      4806700 :    end function div_real_self
    2707              : 
    2708            0 :    function div_self_int(x, y) result(unary)
    2709              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2710              :       integer, intent(in) :: y
    2711              :       type(auto_diff_real_2var_order3) :: unary
    2712              :       real(dp) :: y_dp
    2713            0 :       real(dp) :: q0
    2714            0 :       y_dp = y
    2715            0 :       q0 = powm1(y_dp)
    2716            0 :       unary%val = q0*x%val
    2717            0 :       unary%d1val1 = q0*x%d1val1
    2718            0 :       unary%d1val2 = q0*x%d1val2
    2719            0 :       unary%d2val1 = q0*x%d2val1
    2720            0 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    2721            0 :       unary%d2val2 = q0*x%d2val2
    2722            0 :       unary%d3val1 = q0*x%d3val1
    2723            0 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    2724            0 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    2725            0 :       unary%d3val2 = q0*x%d3val2
    2726            0 :    end function div_self_int
    2727              : 
    2728            0 :    function div_int_self(z, x) result(unary)
    2729              :       integer, intent(in) :: z
    2730              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2731              :       type(auto_diff_real_2var_order3) :: unary
    2732            0 :       real(dp) :: y_dp
    2733            0 :       real(dp) :: q12
    2734            0 :       real(dp) :: q11
    2735            0 :       real(dp) :: q10
    2736            0 :       real(dp) :: q9
    2737            0 :       real(dp) :: q8
    2738            0 :       real(dp) :: q7
    2739            0 :       real(dp) :: q6
    2740            0 :       real(dp) :: q5
    2741            0 :       real(dp) :: q4
    2742            0 :       real(dp) :: q3
    2743            0 :       real(dp) :: q2
    2744            0 :       real(dp) :: q1
    2745              :       real(dp) :: q0
    2746            0 :       y_dp = z
    2747            0 :       q0 = pow2(x%val)
    2748            0 :       q1 = y_dp*powm1(q0)
    2749            0 :       q2 = x%d2val1*x%val
    2750            0 :       q3 = pow2(x%d1val1)
    2751            0 :       q4 = y_dp*powm1(pow3(x%val))
    2752            0 :       q5 = 2.0_dp*x%d1val1
    2753            0 :       q6 = x%d1val1_d1val2*x%val
    2754            0 :       q7 = x%d2val2*x%val
    2755            0 :       q8 = -q7
    2756            0 :       q9 = pow2(x%d1val2)
    2757            0 :       q10 = y_dp*powm1(pow4(x%val))
    2758            0 :       q11 = 4.0_dp*q6
    2759            0 :       q12 = 6.0_dp*x%d1val2
    2760            0 :       unary%val = y_dp*powm1(x%val)
    2761            0 :       unary%d1val1 = -q1*x%d1val1
    2762            0 :       unary%d1val2 = -q1*x%d1val2
    2763            0 :       unary%d2val1 = q4*(2.0_dp*q3 - q2)
    2764            0 :       unary%d1val1_d1val2 = q4*(q5*x%d1val2 - q6)
    2765            0 :       unary%d2val2 = q4*(2.0_dp*q9 + q8)
    2766            0 :       unary%d3val1 = q10*(-6.0_dp*pow3(x%d1val1) + 6.0_dp*q2*x%d1val1 - q0*x%d3val1)
    2767            0 :       unary%d2val1_d1val2 = q10*(2.0_dp*q2*x%d1val2 - q0*x%d2val1_d1val2 + q11*x%d1val1 - q12*q3)
    2768            0 :       unary%d1val1_d2val2 = -q10*(q0*x%d1val1_d2val2 - q11*x%d1val2 + q5*(3.0_dp*q9 + q8))
    2769            0 :       unary%d3val2 = q10*(-6.0_dp*pow3(x%d1val2) - q0*x%d3val2 + q12*q7)
    2770            0 :    end function div_int_self
    2771              : 
    2772        90224 :    function pow_self(x, y) result(binary)
    2773              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2774              :       type(auto_diff_real_2var_order3), intent(in) :: y
    2775              :       type(auto_diff_real_2var_order3) :: binary
    2776        90224 :       real(dp) :: q30
    2777        90224 :       real(dp) :: q29
    2778        90224 :       real(dp) :: q28
    2779        90224 :       real(dp) :: q27
    2780        90224 :       real(dp) :: q26
    2781        90224 :       real(dp) :: q25
    2782        90224 :       real(dp) :: q24
    2783        90224 :       real(dp) :: q23
    2784        90224 :       real(dp) :: q22
    2785        90224 :       real(dp) :: q21
    2786        90224 :       real(dp) :: q20
    2787        90224 :       real(dp) :: q19
    2788        90224 :       real(dp) :: q18
    2789        90224 :       real(dp) :: q17
    2790        90224 :       real(dp) :: q16
    2791        90224 :       real(dp) :: q15
    2792        90224 :       real(dp) :: q14
    2793        90224 :       real(dp) :: q13
    2794        90224 :       real(dp) :: q12
    2795        90224 :       real(dp) :: q11
    2796        90224 :       real(dp) :: q10
    2797        90224 :       real(dp) :: q9
    2798        90224 :       real(dp) :: q8
    2799        90224 :       real(dp) :: q7
    2800              :       real(dp) :: q6
    2801        90224 :       real(dp) :: q5
    2802              :       real(dp) :: q4
    2803        90224 :       real(dp) :: q3
    2804        90224 :       real(dp) :: q2
    2805        90224 :       real(dp) :: q1
    2806        90224 :       real(dp) :: q0
    2807        90224 :       q0 = pow(x%val, y%val - 1)
    2808        90224 :       q1 = x%d1val1*y%val
    2809        90224 :       q2 = log(x%val)
    2810        90224 :       q3 = q2*x%val
    2811        90224 :       q4 = q1 + q3*y%d1val1
    2812        90224 :       q5 = x%d1val2*y%val
    2813        90224 :       q6 = q3*y%d1val2 + q5
    2814        90224 :       q7 = pow(x%val, -2.0_dp + y%val)
    2815        90224 :       q8 = pow2(x%d1val1)
    2816        90224 :       q9 = pow2(x%val)
    2817        90224 :       q10 = q2*q9
    2818        90224 :       q11 = x%d2val1*y%val
    2819        90224 :       q12 = x%d1val1*y%d1val1
    2820        90224 :       q13 = q10*y%d2val1 - q8*y%val + x%val*(2.0_dp*q12 + q11)
    2821        90224 :       q14 = q13 + pow2(q4)
    2822        90224 :       q15 = x%d1val1*y%d1val2
    2823        90224 :       q16 = x%d1val2*y%d1val1
    2824        90224 :       q17 = -q1*x%d1val2 + q10*y%d1val1_d1val2 + x%val*(q15 + q16 + x%d1val1_d1val2*y%val)
    2825        90224 :       q18 = pow2(x%d1val2)
    2826        90224 :       q19 = x%d2val2*y%val
    2827        90224 :       q20 = x%d1val2*y%d1val2
    2828        90224 :       q21 = q10*y%d2val2 - q18*y%val + x%val*(2.0_dp*q20 + q19)
    2829        90224 :       q22 = q21 + pow2(q6)
    2830        90224 :       q23 = pow(x%val, -3.0_dp + y%val)
    2831        90224 :       q24 = 2.0_dp*y%val
    2832        90224 :       q25 = q2*pow3(x%val)
    2833        90224 :       q26 = 3.0_dp*x%d1val1
    2834        90224 :       q27 = 2.0_dp*y%d1val1_d1val2
    2835        90224 :       q28 = 2.0_dp*x%d1val1_d1val2
    2836        90224 :       q29 = 2.0_dp*q17
    2837        90224 :       q30 = 3.0_dp*x%d1val2
    2838        90224 :       binary%val = pow(x%val, y%val)
    2839        90224 :       binary%d1val1 = q0*q4
    2840        90224 :       binary%d1val2 = q0*q6
    2841        90224 :       binary%d2val1 = q14*q7
    2842        90224 :       binary%d1val1_d1val2 = (q17 + q4*q6)*pow(x%val, 3.0_dp + y%val)*powm1(pow5(x%val))
    2843        90224 :       binary%d2val2 = q22*q7
    2844              :       binary%d3val1 = q23*(3.0_dp*q13*q4 + q24*pow3(x%d1val1) + q25*y%d3val1 &
    2845              :                       - q26*x%val*(q11 + q12) + q9*(3.0_dp*x%d2val1*y%d1val1 &
    2846        90224 :                       + q26*y%d2val1 + x%d3val1*y%val) + pow3(q4))
    2847              :       binary%d2val1_d1val2 = (2.0_dp*q5*q8 + q14*q6 + q25*y%d2val1_d1val2 + q29*q4 &
    2848              :                              + q9*(q27*x%d1val1 + q28*y%d1val1 + x%d1val2*y%d2val1 &
    2849              :                              + x%d2val1*y%d1val2 + x%d2val1_d1val2*y%val) &
    2850              :                              - x%val*(2.0_dp*q16*x%d1val1 + q1*q28 + q5*x%d2val1 + q8*y%d1val2)) &
    2851        90224 :                               * pow(x%val, 10.0_dp + y%val)*powm1(pow(x%val, 13.0_dp))
    2852              :       binary%d1val1_d2val2 = q23*(2.0_dp*q1*q18 + q22*q4 + q25*y%d1val1_d2val2 + q29*q6 &
    2853              :                              + q9*(q27*x%d1val2 + q28*y%d1val2 + x%d1val1*y%d2val2 + x%d1val1_d2val2*y%val + x%d2val2*y%d1val1) &
    2854        90224 :                              - x%val*(2.0_dp*q15*x%d1val2 + q1*x%d2val2 + q18*y%d1val1 + q28*q5))
    2855              :       binary%d3val2 = q23 * &
    2856              :                       ( 3.0_dp*q21*q6 + q24*pow3(x%d1val2) + q25*y%d3val2 - q30*x%val*(q19 + q20) &
    2857        90224 :                        + q9*(3.0_dp*x%d2val2*y%d1val2 + q30*y%d2val2 + x%d3val2*y%val) + pow3(q6))
    2858        90224 :    end function pow_self
    2859              : 
    2860      1690722 :    function pow_self_real(x, y) result(unary)
    2861              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2862              :       real(dp), intent(in) :: y
    2863              :       type(auto_diff_real_2var_order3) :: unary
    2864      1690722 :       real(dp) :: q21
    2865      1690722 :       real(dp) :: q20
    2866      1690722 :       real(dp) :: q19
    2867      1690722 :       real(dp) :: q18
    2868      1690722 :       real(dp) :: q17
    2869      1690722 :       real(dp) :: q16
    2870      1690722 :       real(dp) :: q15
    2871      1690722 :       real(dp) :: q14
    2872      1690722 :       real(dp) :: q13
    2873      1690722 :       real(dp) :: q12
    2874      1690722 :       real(dp) :: q11
    2875      1690722 :       real(dp) :: q10
    2876      1690722 :       real(dp) :: q9
    2877      1690722 :       real(dp) :: q8
    2878      1690722 :       real(dp) :: q7
    2879      1690722 :       real(dp) :: q6
    2880      1690722 :       real(dp) :: q5
    2881      1690722 :       real(dp) :: q4
    2882      1690722 :       real(dp) :: q3
    2883      1690722 :       real(dp) :: q2
    2884      1690722 :       real(dp) :: q1
    2885              :       real(dp) :: q0
    2886      1690722 :       q0 = y - 1
    2887      1690722 :       q1 = y*pow(x%val, q0)
    2888      1690722 :       q2 = x%d2val1*x%val
    2889      1690722 :       q3 = pow2(x%d1val1)
    2890      1690722 :       q4 = q3*y
    2891      1690722 :       q5 = pow(x%val, -2.0_dp + y)
    2892      1690722 :       q6 = q5*y
    2893      1690722 :       q7 = x%d1val1_d1val2*x%val
    2894      1690722 :       q8 = x%d1val1*x%d1val2
    2895      1690722 :       q9 = x%d2val2*x%val
    2896      1690722 :       q10 = pow2(x%d1val2)
    2897      1690722 :       q11 = q10*y
    2898      1690722 :       q12 = y*(-q10 + q11 + q9)
    2899      1690722 :       q13 = pow2(x%val)
    2900      1690722 :       q14 = pow2(y)
    2901      1690722 :       q15 = -3.0_dp*y + 2.0_dp + q14
    2902      1690722 :       q16 = y*pow(x%val, -3.0_dp + y)
    2903      1690722 :       q17 = 2.0_dp*q7
    2904      1690722 :       q18 = q17*x%d1val1
    2905      1690722 :       q19 = q2*x%d1val2
    2906      1690722 :       q20 = q3*x%d1val2
    2907      1690722 :       q21 = 3.0_dp*x%d1val2
    2908      1690722 :       unary%val = pow(x%val, y)
    2909      1690722 :       unary%d1val1 = q1*x%d1val1
    2910      1690722 :       unary%d1val2 = q1*x%d1val2
    2911      1690722 :       unary%d2val1 = q6*(q2 - q3 + q4)
    2912      1690722 :       unary%d1val1_d1val2 = q6*(q7 + q8*y - q8)
    2913      1690722 :       unary%d2val2 = q12*q5
    2914      1690722 :       unary%d3val1 = q16*(3.0_dp*q0*q2*x%d1val1 + q13*x%d3val1 + q15*pow3(x%d1val1))
    2915      1690722 :       unary%d2val1_d1val2 = q16*(2.0_dp*q20 + q13*x%d2val1_d1val2 + q14*q20 + q18*y - q18 + q19*y - q19 - q21*q4)
    2916      1690722 :       unary%d1val1_d2val2 = q16*(q0*q17*x%d1val2 + q13*x%d1val1_d2val2 - x%d1val1*(-2.0_dp*q10 + 2.0_dp*q11 - q12 + q9))
    2917      1690722 :       unary%d3val2 = q16*(q0*q21*q9 + q13*x%d3val2 + q15*pow3(x%d1val2))
    2918      1690722 :    end function pow_self_real
    2919              : 
    2920            0 :    function pow_real_self(z, x) result(unary)
    2921              :       real(dp), intent(in) :: z
    2922              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2923              :       type(auto_diff_real_2var_order3) :: unary
    2924            0 :       real(dp) :: q8
    2925            0 :       real(dp) :: q7
    2926            0 :       real(dp) :: q6
    2927            0 :       real(dp) :: q5
    2928            0 :       real(dp) :: q4
    2929            0 :       real(dp) :: q3
    2930            0 :       real(dp) :: q2
    2931              :       real(dp) :: q1
    2932            0 :       real(dp) :: q0
    2933            0 :       q0 = pow(z, x%val)
    2934            0 :       q1 = log(z)
    2935            0 :       q2 = q0*q1
    2936            0 :       q3 = q1*pow2(x%d1val1) + x%d2val1
    2937            0 :       q4 = q1*x%d1val2
    2938            0 :       q5 = q1*pow2(x%d1val2) + x%d2val2
    2939            0 :       q6 = q1*x%d1val1
    2940            0 :       q7 = pow2(q1)
    2941            0 :       q8 = 2.0_dp*x%d1val1_d1val2
    2942            0 :       unary%val = q0
    2943            0 :       unary%d1val1 = q2*x%d1val1
    2944            0 :       unary%d1val2 = q2*x%d1val2
    2945            0 :       unary%d2val1 = q2*q3
    2946            0 :       unary%d1val1_d1val2 = q2*(q4*x%d1val1 + x%d1val1_d1val2)
    2947            0 :       unary%d2val2 = q2*q5
    2948            0 :       unary%d3val1 = q2*(3.0_dp*q6*x%d2val1 + q7*pow3(x%d1val1) + x%d3val1)
    2949            0 :       unary%d2val1_d1val2 = q2*(q3*q4 + q6*q8 + x%d2val1_d1val2)
    2950            0 :       unary%d1val1_d2val2 = q2*(q4*q8 + q5*q6 + x%d1val1_d2val2)
    2951            0 :       unary%d3val2 = q2*(3.0_dp*q4*x%d2val2 + q7*pow3(x%d1val2) + x%d3val2)
    2952            0 :    end function pow_real_self
    2953              : 
    2954            0 :    function pow_self_int(x, y) result(unary)
    2955              :       type(auto_diff_real_2var_order3), intent(in) :: x
    2956              :       integer, intent(in) :: y
    2957              :       type(auto_diff_real_2var_order3) :: unary
    2958              :       real(dp) :: y_dp
    2959            0 :       real(dp) :: q21
    2960            0 :       real(dp) :: q20
    2961            0 :       real(dp) :: q19
    2962            0 :       real(dp) :: q18
    2963            0 :       real(dp) :: q17
    2964            0 :       real(dp) :: q16
    2965            0 :       real(dp) :: q15
    2966            0 :       real(dp) :: q14
    2967            0 :       real(dp) :: q13
    2968            0 :       real(dp) :: q12
    2969            0 :       real(dp) :: q11
    2970            0 :       real(dp) :: q10
    2971            0 :       real(dp) :: q9
    2972            0 :       real(dp) :: q8
    2973            0 :       real(dp) :: q7
    2974            0 :       real(dp) :: q6
    2975            0 :       real(dp) :: q5
    2976            0 :       real(dp) :: q4
    2977            0 :       real(dp) :: q3
    2978            0 :       real(dp) :: q2
    2979            0 :       real(dp) :: q1
    2980              :       real(dp) :: q0
    2981            0 :       y_dp = y
    2982            0 :       q0 = y_dp - 1
    2983            0 :       q1 = y_dp*pow(x%val, q0)
    2984            0 :       q2 = x%d2val1*x%val
    2985            0 :       q3 = pow2(x%d1val1)
    2986            0 :       q4 = q3*y_dp
    2987            0 :       q5 = pow(x%val, -2.0_dp + y_dp)
    2988            0 :       q6 = q5*y_dp
    2989            0 :       q7 = x%d1val1_d1val2*x%val
    2990            0 :       q8 = x%d1val1*x%d1val2
    2991            0 :       q9 = x%d2val2*x%val
    2992            0 :       q10 = pow2(x%d1val2)
    2993            0 :       q11 = q10*y_dp
    2994            0 :       q12 = y_dp*(-q10 + q11 + q9)
    2995            0 :       q13 = pow2(x%val)
    2996            0 :       q14 = pow2(y_dp)
    2997            0 :       q15 = -3.0_dp*y_dp + 2.0_dp + q14
    2998            0 :       q16 = y_dp*pow(x%val, -3.0_dp + y_dp)
    2999            0 :       q17 = 2.0_dp*q7
    3000            0 :       q18 = q17*x%d1val1
    3001            0 :       q19 = q2*x%d1val2
    3002            0 :       q20 = q3*x%d1val2
    3003            0 :       q21 = 3.0_dp*x%d1val2
    3004            0 :       unary%val = pow(x%val, y_dp)
    3005            0 :       unary%d1val1 = q1*x%d1val1
    3006            0 :       unary%d1val2 = q1*x%d1val2
    3007            0 :       unary%d2val1 = q6*(q2 - q3 + q4)
    3008            0 :       unary%d1val1_d1val2 = q6*(q7 + q8*y_dp - q8)
    3009            0 :       unary%d2val2 = q12*q5
    3010            0 :       unary%d3val1 = q16*(3.0_dp*q0*q2*x%d1val1 + q13*x%d3val1 + q15*pow3(x%d1val1))
    3011            0 :       unary%d2val1_d1val2 = q16*(2.0_dp*q20 + q13*x%d2val1_d1val2 + q14*q20 + q18*y_dp - q18 + q19*y_dp - q19 - q21*q4)
    3012            0 :       unary%d1val1_d2val2 = q16*(q0*q17*x%d1val2 + q13*x%d1val1_d2val2 - x%d1val1*(-2.0_dp*q10 + 2.0_dp*q11 - q12 + q9))
    3013            0 :       unary%d3val2 = q16*(q0*q21*q9 + q13*x%d3val2 + q15*pow3(x%d1val2))
    3014            0 :    end function pow_self_int
    3015              : 
    3016            0 :    function pow_int_self(z, x) result(unary)
    3017              :       integer, intent(in) :: z
    3018              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3019              :       type(auto_diff_real_2var_order3) :: unary
    3020              :       real(dp) :: y_dp
    3021            0 :       real(dp) :: q8
    3022            0 :       real(dp) :: q7
    3023            0 :       real(dp) :: q6
    3024            0 :       real(dp) :: q5
    3025            0 :       real(dp) :: q4
    3026            0 :       real(dp) :: q3
    3027            0 :       real(dp) :: q2
    3028              :       real(dp) :: q1
    3029            0 :       real(dp) :: q0
    3030            0 :       y_dp = z
    3031            0 :       q0 = pow(y_dp, x%val)
    3032            0 :       q1 = log(y_dp)
    3033            0 :       q2 = q0*q1
    3034            0 :       q3 = q1*pow2(x%d1val1) + x%d2val1
    3035            0 :       q4 = q1*x%d1val2
    3036            0 :       q5 = q1*pow2(x%d1val2) + x%d2val2
    3037            0 :       q6 = q1*x%d1val1
    3038            0 :       q7 = pow2(q1)
    3039            0 :       q8 = 2.0_dp*x%d1val1_d1val2
    3040            0 :       unary%val = q0
    3041            0 :       unary%d1val1 = q2*x%d1val1
    3042            0 :       unary%d1val2 = q2*x%d1val2
    3043            0 :       unary%d2val1 = q2*q3
    3044            0 :       unary%d1val1_d1val2 = q2*(q4*x%d1val1 + x%d1val1_d1val2)
    3045            0 :       unary%d2val2 = q2*q5
    3046            0 :       unary%d3val1 = q2*(3.0_dp*q6*x%d2val1 + q7*pow3(x%d1val1) + x%d3val1)
    3047            0 :       unary%d2val1_d1val2 = q2*(q3*q4 + q6*q8 + x%d2val1_d1val2)
    3048            0 :       unary%d1val1_d2val2 = q2*(q4*q8 + q5*q6 + x%d1val1_d2val2)
    3049            0 :       unary%d3val2 = q2*(3.0_dp*q4*x%d2val2 + q7*pow3(x%d1val2) + x%d3val2)
    3050            0 :    end function pow_int_self
    3051              : 
    3052            0 :    function max_self(x, y) result(binary)
    3053              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3054              :       type(auto_diff_real_2var_order3), intent(in) :: y
    3055              :       type(auto_diff_real_2var_order3) :: binary
    3056            0 :       real(dp) :: q1
    3057            0 :       real(dp) :: q0
    3058            0 :       q0 = Heaviside(x%val - y%val)
    3059            0 :       q1 = Heaviside(-x%val + y%val)
    3060            0 :       binary%val = Max(x%val, y%val)
    3061            0 :       binary%d1val1 = q0*x%d1val1 + q1*y%d1val1
    3062            0 :       binary%d1val2 = q0*x%d1val2 + q1*y%d1val2
    3063            0 :       binary%d2val1 = q0*x%d2val1 + q1*y%d2val1
    3064            0 :       binary%d1val1_d1val2 = q0*x%d1val1_d1val2 + q1*y%d1val1_d1val2
    3065            0 :       binary%d2val2 = q0*x%d2val2 + q1*y%d2val2
    3066            0 :       binary%d3val1 = q0*x%d3val1 + q1*y%d3val1
    3067            0 :       binary%d2val1_d1val2 = q0*x%d2val1_d1val2 + q1*y%d2val1_d1val2
    3068            0 :       binary%d1val1_d2val2 = q0*x%d1val1_d2val2 + q1*y%d1val1_d2val2
    3069            0 :       binary%d3val2 = q0*x%d3val2 + q1*y%d3val2
    3070            0 :    end function max_self
    3071              : 
    3072            0 :    function max_self_real(x, y) result(unary)
    3073              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3074              :       real(dp), intent(in) :: y
    3075              :       type(auto_diff_real_2var_order3) :: unary
    3076            0 :       real(dp) :: q0
    3077            0 :       q0 = Heaviside(x%val - y)
    3078            0 :       unary%val = Max(x%val, y)
    3079            0 :       unary%d1val1 = q0*x%d1val1
    3080            0 :       unary%d1val2 = q0*x%d1val2
    3081            0 :       unary%d2val1 = q0*x%d2val1
    3082            0 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    3083            0 :       unary%d2val2 = q0*x%d2val2
    3084            0 :       unary%d3val1 = q0*x%d3val1
    3085            0 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    3086            0 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    3087            0 :       unary%d3val2 = q0*x%d3val2
    3088            0 :    end function max_self_real
    3089              : 
    3090       667348 :    function max_real_self(z, x) result(unary)
    3091              :       real(dp), intent(in) :: z
    3092              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3093              :       type(auto_diff_real_2var_order3) :: unary
    3094       667348 :       real(dp) :: q0
    3095       667348 :       q0 = Heaviside(x%val - z)
    3096       667348 :       unary%val = Max(x%val, z)
    3097       667348 :       unary%d1val1 = q0*x%d1val1
    3098       667348 :       unary%d1val2 = q0*x%d1val2
    3099       667348 :       unary%d2val1 = q0*x%d2val1
    3100       667348 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    3101       667348 :       unary%d2val2 = q0*x%d2val2
    3102       667348 :       unary%d3val1 = q0*x%d3val1
    3103       667348 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    3104       667348 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    3105       667348 :       unary%d3val2 = q0*x%d3val2
    3106       667348 :    end function max_real_self
    3107              : 
    3108            0 :    function max_self_int(x, y) result(unary)
    3109              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3110              :       integer, intent(in) :: y
    3111              :       type(auto_diff_real_2var_order3) :: unary
    3112            0 :       real(dp) :: y_dp
    3113            0 :       real(dp) :: q0
    3114            0 :       y_dp = y
    3115            0 :       q0 = Heaviside(x%val - y_dp)
    3116            0 :       unary%val = Max(x%val, y_dp)
    3117            0 :       unary%d1val1 = q0*x%d1val1
    3118            0 :       unary%d1val2 = q0*x%d1val2
    3119            0 :       unary%d2val1 = q0*x%d2val1
    3120            0 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    3121            0 :       unary%d2val2 = q0*x%d2val2
    3122            0 :       unary%d3val1 = q0*x%d3val1
    3123            0 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    3124            0 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    3125            0 :       unary%d3val2 = q0*x%d3val2
    3126            0 :    end function max_self_int
    3127              : 
    3128            0 :    function max_int_self(z, x) result(unary)
    3129              :       integer, intent(in) :: z
    3130              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3131              :       type(auto_diff_real_2var_order3) :: unary
    3132            0 :       real(dp) :: y_dp
    3133            0 :       real(dp) :: q0
    3134            0 :       y_dp = z
    3135            0 :       q0 = Heaviside(x%val - y_dp)
    3136            0 :       unary%val = Max(x%val, y_dp)
    3137            0 :       unary%d1val1 = q0*x%d1val1
    3138            0 :       unary%d1val2 = q0*x%d1val2
    3139            0 :       unary%d2val1 = q0*x%d2val1
    3140            0 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    3141            0 :       unary%d2val2 = q0*x%d2val2
    3142            0 :       unary%d3val1 = q0*x%d3val1
    3143            0 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    3144            0 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    3145            0 :       unary%d3val2 = q0*x%d3val2
    3146            0 :    end function max_int_self
    3147              : 
    3148        45520 :    function min_self(x, y) result(binary)
    3149              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3150              :       type(auto_diff_real_2var_order3), intent(in) :: y
    3151              :       type(auto_diff_real_2var_order3) :: binary
    3152        45520 :       real(dp) :: q1
    3153        45520 :       real(dp) :: q0
    3154        45520 :       q0 = Heaviside(-x%val + y%val)
    3155        45520 :       q1 = Heaviside(x%val - y%val)
    3156        45520 :       binary%val = Min(x%val, y%val)
    3157        45520 :       binary%d1val1 = q0*x%d1val1 + q1*y%d1val1
    3158        45520 :       binary%d1val2 = q0*x%d1val2 + q1*y%d1val2
    3159        45520 :       binary%d2val1 = q0*x%d2val1 + q1*y%d2val1
    3160        45520 :       binary%d1val1_d1val2 = q0*x%d1val1_d1val2 + q1*y%d1val1_d1val2
    3161        45520 :       binary%d2val2 = q0*x%d2val2 + q1*y%d2val2
    3162        45520 :       binary%d3val1 = q0*x%d3val1 + q1*y%d3val1
    3163        45520 :       binary%d2val1_d1val2 = q0*x%d2val1_d1val2 + q1*y%d2val1_d1val2
    3164        45520 :       binary%d1val1_d2val2 = q0*x%d1val1_d2val2 + q1*y%d1val1_d2val2
    3165        45520 :       binary%d3val2 = q0*x%d3val2 + q1*y%d3val2
    3166        45520 :    end function min_self
    3167              : 
    3168            0 :    function min_self_real(x, y) result(unary)
    3169              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3170              :       real(dp), intent(in) :: y
    3171              :       type(auto_diff_real_2var_order3) :: unary
    3172            0 :       real(dp) :: q0
    3173            0 :       q0 = Heaviside(-x%val + y)
    3174            0 :       unary%val = Min(x%val, y)
    3175            0 :       unary%d1val1 = q0*x%d1val1
    3176            0 :       unary%d1val2 = q0*x%d1val2
    3177            0 :       unary%d2val1 = q0*x%d2val1
    3178            0 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    3179            0 :       unary%d2val2 = q0*x%d2val2
    3180            0 :       unary%d3val1 = q0*x%d3val1
    3181            0 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    3182            0 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    3183            0 :       unary%d3val2 = q0*x%d3val2
    3184            0 :    end function min_self_real
    3185              : 
    3186       621828 :    function min_real_self(z, x) result(unary)
    3187              :       real(dp), intent(in) :: z
    3188              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3189              :       type(auto_diff_real_2var_order3) :: unary
    3190       621828 :       real(dp) :: q0
    3191       621828 :       q0 = Heaviside(-x%val + z)
    3192       621828 :       unary%val = Min(x%val, z)
    3193       621828 :       unary%d1val1 = q0*x%d1val1
    3194       621828 :       unary%d1val2 = q0*x%d1val2
    3195       621828 :       unary%d2val1 = q0*x%d2val1
    3196       621828 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    3197       621828 :       unary%d2val2 = q0*x%d2val2
    3198       621828 :       unary%d3val1 = q0*x%d3val1
    3199       621828 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    3200       621828 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    3201       621828 :       unary%d3val2 = q0*x%d3val2
    3202       621828 :    end function min_real_self
    3203              : 
    3204            0 :    function min_self_int(x, y) result(unary)
    3205              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3206              :       integer, intent(in) :: y
    3207              :       type(auto_diff_real_2var_order3) :: unary
    3208            0 :       real(dp) :: y_dp
    3209            0 :       real(dp) :: q0
    3210            0 :       y_dp = y
    3211            0 :       q0 = Heaviside(-x%val + y_dp)
    3212            0 :       unary%val = Min(x%val, y_dp)
    3213            0 :       unary%d1val1 = q0*x%d1val1
    3214            0 :       unary%d1val2 = q0*x%d1val2
    3215            0 :       unary%d2val1 = q0*x%d2val1
    3216            0 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    3217            0 :       unary%d2val2 = q0*x%d2val2
    3218            0 :       unary%d3val1 = q0*x%d3val1
    3219            0 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    3220            0 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    3221            0 :       unary%d3val2 = q0*x%d3val2
    3222            0 :    end function min_self_int
    3223              : 
    3224            0 :    function min_int_self(z, x) result(unary)
    3225              :       integer, intent(in) :: z
    3226              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3227              :       type(auto_diff_real_2var_order3) :: unary
    3228            0 :       real(dp) :: y_dp
    3229            0 :       real(dp) :: q0
    3230            0 :       y_dp = z
    3231            0 :       q0 = Heaviside(-x%val + y_dp)
    3232            0 :       unary%val = Min(x%val, y_dp)
    3233            0 :       unary%d1val1 = q0*x%d1val1
    3234            0 :       unary%d1val2 = q0*x%d1val2
    3235            0 :       unary%d2val1 = q0*x%d2val1
    3236            0 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    3237            0 :       unary%d2val2 = q0*x%d2val2
    3238            0 :       unary%d3val1 = q0*x%d3val1
    3239            0 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    3240            0 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    3241            0 :       unary%d3val2 = q0*x%d3val2
    3242            0 :    end function min_int_self
    3243              : 
    3244            0 :    function dim_self(x, y) result(binary)
    3245              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3246              :       type(auto_diff_real_2var_order3), intent(in) :: y
    3247              :       type(auto_diff_real_2var_order3) :: binary
    3248            0 :       real(dp) :: q1
    3249              :       real(dp) :: q0
    3250            0 :       q0 = x%val - y%val
    3251            0 :       q1 = 0.5_dp*sgn(q0)
    3252            0 :       binary%val = -0.5_dp*y%val + 0.5_dp*x%val + 0.5_dp*Abs(q0)
    3253            0 :       binary%d1val1 = -0.5_dp*y%d1val1 + 0.5_dp*x%d1val1 + q1*(x%d1val1 - y%d1val1)
    3254            0 :       binary%d1val2 = -0.5_dp*y%d1val2 + 0.5_dp*x%d1val2 + q1*(x%d1val2 - y%d1val2)
    3255            0 :       binary%d2val1 = -0.5_dp*y%d2val1 + 0.5_dp*x%d2val1 + q1*(x%d2val1 - y%d2val1)
    3256            0 :       binary%d1val1_d1val2 = -0.5_dp*y%d1val1_d1val2 + 0.5_dp*x%d1val1_d1val2 + q1*(x%d1val1_d1val2 - y%d1val1_d1val2)
    3257            0 :       binary%d2val2 = -0.5_dp*y%d2val2 + 0.5_dp*x%d2val2 + q1*(x%d2val2 - y%d2val2)
    3258            0 :       binary%d3val1 = -0.5_dp*y%d3val1 + 0.5_dp*x%d3val1 + q1*(x%d3val1 - y%d3val1)
    3259            0 :       binary%d2val1_d1val2 = -0.5_dp*y%d2val1_d1val2 + 0.5_dp*x%d2val1_d1val2 + q1*(x%d2val1_d1val2 - y%d2val1_d1val2)
    3260            0 :       binary%d1val1_d2val2 = -0.5_dp*y%d1val1_d2val2 + 0.5_dp*x%d1val1_d2val2 + q1*(x%d1val1_d2val2 - y%d1val1_d2val2)
    3261            0 :       binary%d3val2 = -0.5_dp*y%d3val2 + 0.5_dp*x%d3val2 + q1*(x%d3val2 - y%d3val2)
    3262            0 :    end function dim_self
    3263              : 
    3264            0 :    function dim_self_real(x, y) result(unary)
    3265              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3266              :       real(dp), intent(in) :: y
    3267              :       type(auto_diff_real_2var_order3) :: unary
    3268            0 :       real(dp) :: q5
    3269            0 :       real(dp) :: q4
    3270            0 :       real(dp) :: q3
    3271            0 :       real(dp) :: q2
    3272            0 :       real(dp) :: q1
    3273              :       real(dp) :: q0
    3274            0 :       q0 = x%val - y
    3275            0 :       q1 = sgn(q0)
    3276            0 :       q2 = 0.5_dp*q1 + 0.5_dp
    3277            0 :       q3 = 0.5_dp*x%d1val1_d1val2
    3278            0 :       q4 = 0.5_dp*x%d2val1_d1val2
    3279            0 :       q5 = 0.5_dp*x%d1val1_d2val2
    3280            0 :       unary%val = -0.5_dp*y + 0.5_dp*x%val + 0.5_dp*Abs(q0)
    3281            0 :       unary%d1val1 = q2*x%d1val1
    3282            0 :       unary%d1val2 = q2*x%d1val2
    3283            0 :       unary%d2val1 = q2*x%d2val1
    3284            0 :       unary%d1val1_d1val2 = q1*q3 + q3
    3285            0 :       unary%d2val2 = q2*x%d2val2
    3286            0 :       unary%d3val1 = q2*x%d3val1
    3287            0 :       unary%d2val1_d1val2 = q1*q4 + q4
    3288            0 :       unary%d1val1_d2val2 = q1*q5 + q5
    3289            0 :       unary%d3val2 = q2*x%d3val2
    3290            0 :    end function dim_self_real
    3291              : 
    3292            0 :    function dim_real_self(z, x) result(unary)
    3293              :       real(dp), intent(in) :: z
    3294              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3295              :       type(auto_diff_real_2var_order3) :: unary
    3296            0 :       real(dp) :: q5
    3297            0 :       real(dp) :: q4
    3298            0 :       real(dp) :: q3
    3299            0 :       real(dp) :: q2
    3300            0 :       real(dp) :: q1
    3301              :       real(dp) :: q0
    3302            0 :       q0 = x%val - z
    3303            0 :       q1 = sgn(q0)
    3304            0 :       q2 = -0.5_dp + 0.5_dp*q1
    3305            0 :       q3 = 0.5_dp*x%d1val1_d1val2
    3306            0 :       q4 = 0.5_dp*x%d2val1_d1val2
    3307            0 :       q5 = 0.5_dp*x%d1val1_d2val2
    3308            0 :       unary%val = -0.5_dp*x%val + 0.5_dp*z + 0.5_dp*Abs(q0)
    3309            0 :       unary%d1val1 = q2*x%d1val1
    3310            0 :       unary%d1val2 = q2*x%d1val2
    3311            0 :       unary%d2val1 = q2*x%d2val1
    3312            0 :       unary%d1val1_d1val2 = q1*q3 - q3
    3313            0 :       unary%d2val2 = q2*x%d2val2
    3314            0 :       unary%d3val1 = q2*x%d3val1
    3315            0 :       unary%d2val1_d1val2 = q1*q4 - q4
    3316            0 :       unary%d1val1_d2val2 = q1*q5 - q5
    3317            0 :       unary%d3val2 = q2*x%d3val2
    3318            0 :    end function dim_real_self
    3319              : 
    3320            0 :    function dim_self_int(x, y) result(unary)
    3321              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3322              :       integer, intent(in) :: y
    3323              :       type(auto_diff_real_2var_order3) :: unary
    3324            0 :       real(dp) :: y_dp
    3325            0 :       real(dp) :: q5
    3326            0 :       real(dp) :: q4
    3327            0 :       real(dp) :: q3
    3328            0 :       real(dp) :: q2
    3329            0 :       real(dp) :: q1
    3330              :       real(dp) :: q0
    3331            0 :       y_dp = y
    3332            0 :       q0 = x%val - y_dp
    3333            0 :       q1 = sgn(q0)
    3334            0 :       q2 = 0.5_dp*q1 + 0.5_dp
    3335            0 :       q3 = 0.5_dp*x%d1val1_d1val2
    3336            0 :       q4 = 0.5_dp*x%d2val1_d1val2
    3337            0 :       q5 = 0.5_dp*x%d1val1_d2val2
    3338            0 :       unary%val = -0.5_dp*y_dp + 0.5_dp*x%val + 0.5_dp*Abs(q0)
    3339            0 :       unary%d1val1 = q2*x%d1val1
    3340            0 :       unary%d1val2 = q2*x%d1val2
    3341            0 :       unary%d2val1 = q2*x%d2val1
    3342            0 :       unary%d1val1_d1val2 = q1*q3 + q3
    3343            0 :       unary%d2val2 = q2*x%d2val2
    3344            0 :       unary%d3val1 = q2*x%d3val1
    3345            0 :       unary%d2val1_d1val2 = q1*q4 + q4
    3346            0 :       unary%d1val1_d2val2 = q1*q5 + q5
    3347            0 :       unary%d3val2 = q2*x%d3val2
    3348            0 :    end function dim_self_int
    3349              : 
    3350            0 :    function dim_int_self(z, x) result(unary)
    3351              :       integer, intent(in) :: z
    3352              :       type(auto_diff_real_2var_order3), intent(in) :: x
    3353              :       type(auto_diff_real_2var_order3) :: unary
    3354            0 :       real(dp) :: y_dp
    3355            0 :       real(dp) :: q5
    3356            0 :       real(dp) :: q4
    3357            0 :       real(dp) :: q3
    3358            0 :       real(dp) :: q2
    3359            0 :       real(dp) :: q1
    3360              :       real(dp) :: q0
    3361            0 :       y_dp = z
    3362            0 :       q0 = x%val - y_dp
    3363            0 :       q1 = sgn(q0)
    3364            0 :       q2 = -0.5_dp + 0.5_dp*q1
    3365            0 :       q3 = 0.5_dp*x%d1val1_d1val2
    3366            0 :       q4 = 0.5_dp*x%d2val1_d1val2
    3367            0 :       q5 = 0.5_dp*x%d1val1_d2val2
    3368            0 :       unary%val = -0.5_dp*x%val + 0.5_dp*y_dp + 0.5_dp*Abs(q0)
    3369            0 :       unary%d1val1 = q2*x%d1val1
    3370            0 :       unary%d1val2 = q2*x%d1val2
    3371            0 :       unary%d2val1 = q2*x%d2val1
    3372            0 :       unary%d1val1_d1val2 = q1*q3 - q3
    3373            0 :       unary%d2val2 = q2*x%d2val2
    3374            0 :       unary%d3val1 = q2*x%d3val1
    3375            0 :       unary%d2val1_d1val2 = q1*q4 - q4
    3376            0 :       unary%d1val1_d2val2 = q1*q5 - q5
    3377            0 :       unary%d3val2 = q2*x%d3val2
    3378            0 :    end function dim_int_self
    3379              : 
    3380       538514 :    function differentiate_auto_diff_real_2var_order3_1(this) result(derivative)
    3381              :       type(auto_diff_real_2var_order3), intent(in) :: this
    3382              :       type(auto_diff_real_2var_order3) :: derivative
    3383       538514 :       derivative%val = this%d1val1
    3384       538514 :       derivative%d1val1 = this%d2val1
    3385       538514 :       derivative%d1val2 = this%d1val1_d1val2
    3386       538514 :       derivative%d2val1 = this%d3val1
    3387       538514 :       derivative%d1val1_d1val2 = this%d2val1_d1val2
    3388       538514 :       derivative%d2val2 = this%d1val1_d2val2
    3389       538514 :       derivative%d3val1 = 0.0_dp
    3390       538514 :       derivative%d2val1_d1val2 = 0.0_dp
    3391       538514 :       derivative%d1val1_d2val2 = 0.0_dp
    3392       538514 :       derivative%d3val2 = 0.0_dp
    3393       538514 :    end function differentiate_auto_diff_real_2var_order3_1
    3394              : 
    3395       136560 :    function differentiate_auto_diff_real_2var_order3_2(this) result(derivative)
    3396              :       type(auto_diff_real_2var_order3), intent(in) :: this
    3397              :       type(auto_diff_real_2var_order3) :: derivative
    3398       136560 :       derivative%val = this%d1val2
    3399       136560 :       derivative%d1val1 = this%d1val1_d1val2
    3400       136560 :       derivative%d1val2 = this%d2val2
    3401       136560 :       derivative%d2val1 = this%d2val1_d1val2
    3402       136560 :       derivative%d1val1_d1val2 = this%d1val1_d2val2
    3403       136560 :       derivative%d2val2 = this%d3val2
    3404       136560 :       derivative%d3val1 = 0.0_dp
    3405       136560 :       derivative%d2val1_d1val2 = 0.0_dp
    3406       136560 :       derivative%d1val1_d2val2 = 0.0_dp
    3407       136560 :       derivative%d3val2 = 0.0_dp
    3408       136560 :    end function differentiate_auto_diff_real_2var_order3_2
    3409              : 
    3410            0 : end module auto_diff_real_2var_order3_module
        

Generated by: LCOV version 2.0-1