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.9 % 1814 670
Test Date: 2026-01-29 18:28:55 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     22002274 :    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     22002274 :       this%val = other%val
     400     22002274 :       this%d1val1 = other%d1val1
     401     22002274 :       this%d1val2 = other%d1val2
     402     22002274 :       this%d2val1 = other%d2val1
     403     22002274 :       this%d1val1_d1val2 = other%d1val1_d1val2
     404     22002274 :       this%d2val2 = other%d2val2
     405     22002274 :       this%d3val1 = other%d3val1
     406     22002274 :       this%d2val1_d1val2 = other%d2val1_d1val2
     407     22002274 :       this%d1val1_d2val2 = other%d1val1_d2val2
     408     22002274 :       this%d3val2 = other%d3val2
     409     22002274 :    end subroutine assign_from_self
     410              : 
     411      1000074 :    subroutine assign_from_real_dp(this, other)
     412              :       type(auto_diff_real_2var_order3), intent(out) :: this
     413              :       real(dp), intent(in) :: other
     414      1000074 :       this%val = other
     415              :       this%d1val1 = 0.0_dp
     416              :       this%d1val2 = 0.0_dp
     417              :       this%d2val1 = 0.0_dp
     418              :       this%d1val1_d1val2 = 0.0_dp
     419              :       this%d2val2 = 0.0_dp
     420              :       this%d3val1 = 0.0_dp
     421              :       this%d2val1_d1val2 = 0.0_dp
     422              :       this%d1val1_d2val2 = 0.0_dp
     423              :       this%d3val2 = 0.0_dp
     424      1000074 :    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              :       this%d1val1 = 0.0_dp
     431              :       this%d1val2 = 0.0_dp
     432              :       this%d2val1 = 0.0_dp
     433              :       this%d1val1_d1val2 = 0.0_dp
     434              :       this%d2val2 = 0.0_dp
     435              :       this%d3val1 = 0.0_dp
     436              :       this%d2val1_d1val2 = 0.0_dp
     437              :       this%d1val1_d2val2 = 0.0_dp
     438              :       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       454594 :    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       454594 :       z = (this%val > other)
     523       454594 :    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        32062 :    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        32062 :       z = (this%val < other%val)
     551        32062 :    end function less_self
     552              : 
     553       486656 :    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       486656 :       z = (this%val < other)
     558       486656 :    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        96186 :    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        96186 :       z = (this%val < other)
     572        96186 :    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              :       real(dp) :: q4
     659              :       real(dp) :: q3
     660              :       real(dp) :: q2
     661              :       real(dp) :: q1
     662              :       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       422532 :    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              :       real(dp) :: q26
     697              :       real(dp) :: q25
     698              :       real(dp) :: q24
     699              :       real(dp) :: q23
     700              :       real(dp) :: q22
     701              :       real(dp) :: q21
     702              :       real(dp) :: q20
     703              :       real(dp) :: q19
     704              :       real(dp) :: q18
     705              :       real(dp) :: q17
     706              :       real(dp) :: q16
     707              :       real(dp) :: q15
     708              :       real(dp) :: q14
     709              :       real(dp) :: q13
     710              :       real(dp) :: q12
     711              :       real(dp) :: q11
     712              :       real(dp) :: q10
     713              :       real(dp) :: q9
     714              :       real(dp) :: q8
     715              :       real(dp) :: q7
     716              :       real(dp) :: q6
     717              :       real(dp) :: q5
     718              :       real(dp) :: q4
     719              :       real(dp) :: q3
     720              :       real(dp) :: q2
     721              :       real(dp) :: q1
     722              :       real(dp) :: q0
     723       422532 :       q0 = pow2(x%d1val1)
     724       422532 :       q1 = pow2(y%d1val1)
     725       422532 :       q2 = x%d1val1*z_d1x_d1y
     726       422532 :       q3 = 2.0_dp*q2
     727       422532 :       q4 = x%d1val2*z_d2x
     728       422532 :       q5 = y%d1val2*z_d1x_d1y
     729       422532 :       q6 = x%d1val2*z_d1x_d1y
     730       422532 :       q7 = y%d1val2*z_d2y
     731       422532 :       q8 = pow2(x%d1val2)
     732       422532 :       q9 = pow2(y%d1val2)
     733       422532 :       q10 = 2.0_dp*q5
     734       422532 :       q11 = x%d1val1*z_d2x
     735       422532 :       q12 = 3.0_dp*x%d2val1
     736       422532 :       q13 = 3.0_dp*y%d2val1
     737       422532 :       q14 = y%d1val1*z_d1x_d1y
     738       422532 :       q15 = y%d1val1*z_d2y
     739       422532 :       q16 = q1*z_d1x_d2y
     740       422532 :       q17 = q0*z_d2x_d1y
     741       422532 :       q18 = 2.0_dp*x%d1val1_d1val2
     742       422532 :       q19 = 2.0_dp*y%d1val1_d1val2
     743       422532 :       q20 = 2.0_dp*x%d1val1*y%d1val1
     744       422532 :       q21 = x%d1val2*z_d2x_d1y
     745       422532 :       q22 = y%d1val2*z_d1x_d2y
     746       422532 :       q23 = q9*z_d1x_d2y
     747       422532 :       q24 = q8*z_d2x_d1y
     748       422532 :       q25 = 3.0_dp*x%d2val2
     749       422532 :       q26 = 3.0_dp*y%d2val2
     750       422532 :       binary%val = z_val
     751       422532 :       binary%d1val1 = x%d1val1*z_d1x + y%d1val1*z_d1y
     752       422532 :       binary%d1val2 = x%d1val2*z_d1x + y%d1val2*z_d1y
     753       422532 :       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       422532 :                            + x%d1val1_d1val2*z_d1x + y%d1val1_d1val2*z_d1y
     756       422532 :       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       422532 :                       + 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       422532 :                            + 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       422532 :                              + 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       422532 :                       + z_d3y*pow3(y%d1val2)
     772       422532 :    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              :       real(dp) :: q15
     793              :       real(dp) :: q14
     794              :       real(dp) :: q13
     795              :       real(dp) :: q12
     796              :       real(dp) :: q11
     797              :       real(dp) :: q10
     798              :       real(dp) :: q9
     799              :       real(dp) :: q8
     800              :       real(dp) :: q7
     801              :       real(dp) :: q6
     802              :       real(dp) :: q5
     803              :       real(dp) :: q4
     804              :       real(dp) :: q3
     805              :       real(dp) :: q2
     806              :       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      2305032 :    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      2305032 :       unary%val = -x%val
     841      2305032 :       unary%d1val1 = -x%d1val1
     842      2305032 :       unary%d1val2 = -x%d1val2
     843      2305032 :       unary%d2val1 = -x%d2val1
     844      2305032 :       unary%d1val1_d1val2 = -x%d1val1_d1val2
     845      2305032 :       unary%d2val2 = -x%d2val2
     846      2305032 :       unary%d3val1 = -x%d3val1
     847      2305032 :       unary%d2val1_d1val2 = -x%d2val1_d1val2
     848      2305032 :       unary%d1val1_d2val2 = -x%d1val1_d2val2
     849      2305032 :       unary%d3val2 = -x%d3val2
     850      2305032 :    end function unary_minus_self
     851              : 
     852      1088392 :    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              :       real(dp) :: q3
     856              :       real(dp) :: q2
     857              :       real(dp) :: q1
     858              :       real(dp) :: q0
     859      1088392 :       q0 = exp(x%val)
     860      1088392 :       q1 = x%d2val1 + pow2(x%d1val1)
     861      1088392 :       q2 = x%d2val2 + pow2(x%d1val2)
     862      1088392 :       q3 = 2.0_dp*x%d1val1_d1val2
     863      1088392 :       unary%val = q0
     864      1088392 :       unary%d1val1 = q0*x%d1val1
     865      1088392 :       unary%d1val2 = q0*x%d1val2
     866      1088392 :       unary%d2val1 = q0*q1
     867      1088392 :       unary%d1val1_d1val2 = q0*(x%d1val1*x%d1val2 + x%d1val1_d1val2)
     868      1088392 :       unary%d2val2 = q0*q2
     869      1088392 :       unary%d3val1 = q0*(3.0_dp*x%d1val1*x%d2val1 + x%d3val1 + pow3(x%d1val1))
     870      1088392 :       unary%d2val1_d1val2 = q0*(q1*x%d1val2 + q3*x%d1val1 + x%d2val1_d1val2)
     871      1088392 :       unary%d1val1_d2val2 = q0*(q2*x%d1val1 + q3*x%d1val2 + x%d1val1_d2val2)
     872      1088392 :       unary%d3val2 = q0*(3.0_dp*x%d1val2*x%d2val2 + x%d3val2 + pow3(x%d1val2))
     873      1088392 :    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              :       real(dp) :: q3
     879              :       real(dp) :: q2
     880              :       real(dp) :: q1
     881              :       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              :       real(dp) :: q8
     902              :       real(dp) :: q7
     903              :       real(dp) :: q6
     904              :       real(dp) :: q5
     905              :       real(dp) :: q4
     906              :       real(dp) :: q3
     907              :       real(dp) :: q2
     908              :       real(dp) :: q1
     909              :       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              :       real(dp) :: q12
     935              :       real(dp) :: q11
     936              :       real(dp) :: q10
     937              :       real(dp) :: q9
     938              :       real(dp) :: q8
     939              :       real(dp) :: q7
     940              :       real(dp) :: q6
     941              :       real(dp) :: q5
     942              :       real(dp) :: q4
     943              :       real(dp) :: q3
     944              :       real(dp) :: q2
     945              :       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      2906768 :    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              :       real(dp) :: q9
     976              :       real(dp) :: q8
     977              :       real(dp) :: q7
     978              :       real(dp) :: q6
     979              :       real(dp) :: q5
     980              :       real(dp) :: q4
     981              :       real(dp) :: q3
     982              :       real(dp) :: q2
     983              :       real(dp) :: q1
     984              :       real(dp) :: q0
     985      2906768 :       q0 = powm1(x%val)
     986      2906768 :       q1 = pow2(x%val)
     987      2906768 :       q2 = powm1(q1)
     988      2906768 :       q3 = x%d2val1*x%val
     989      2906768 :       q4 = pow2(x%d1val1)
     990      2906768 :       q5 = x%d1val1_d1val2*x%val
     991      2906768 :       q6 = x%d2val2*x%val
     992      2906768 :       q7 = pow2(x%d1val2)
     993      2906768 :       q8 = powm1(pow3(x%val))
     994      2906768 :       q9 = 2.0_dp*x%d1val2
     995      2906768 :       unary%val = log(x%val)
     996      2906768 :       unary%d1val1 = q0*x%d1val1
     997      2906768 :       unary%d1val2 = q0*x%d1val2
     998      2906768 :       unary%d2val1 = q2*(q3 - q4)
     999      2906768 :       unary%d1val1_d1val2 = q2*(q5 - x%d1val1*x%d1val2)
    1000      2906768 :       unary%d2val2 = q2*(q6 - q7)
    1001      2906768 :       unary%d3val1 = q8*(-3.0_dp*q3*x%d1val1 + 2.0_dp*pow3(x%d1val1) + q1*x%d3val1)
    1002      2906768 :       unary%d2val1_d1val2 = q8*(-2.0_dp*q5*x%d1val1 + q1*x%d2val1_d1val2 - q3*x%d1val2 + q4*q9)
    1003      2906768 :       unary%d1val1_d2val2 = q8*(q1*x%d1val1_d2val2 - q5*q9 + x%d1val1*(2.0_dp*q7 - q6))
    1004      2906768 :       unary%d3val2 = q8*(-3.0_dp*q6*x%d1val2 + 2.0_dp*pow3(x%d1val2) + q1*x%d3val2)
    1005      2906768 :    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              :       real(dp) :: q10
    1011              :       real(dp) :: q9
    1012              :       real(dp) :: q8
    1013              :       real(dp) :: q7
    1014              :       real(dp) :: q6
    1015              :       real(dp) :: q5
    1016              :       real(dp) :: q4
    1017              :       real(dp) :: q3
    1018              :       real(dp) :: q2
    1019              :       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              :       real(dp) :: q9
    1048              :       real(dp) :: q8
    1049              :       real(dp) :: q7
    1050              :       real(dp) :: q6
    1051              :       real(dp) :: q5
    1052              :       real(dp) :: q4
    1053              :       real(dp) :: q3
    1054              :       real(dp) :: q2
    1055              :       real(dp) :: q1
    1056              :       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        64124 :    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              :       real(dp) :: q10
    1083              :       real(dp) :: q9
    1084              :       real(dp) :: q8
    1085              :       real(dp) :: q7
    1086              :       real(dp) :: q6
    1087              :       real(dp) :: q5
    1088              :       real(dp) :: q4
    1089              :       real(dp) :: q3
    1090              :       real(dp) :: q2
    1091              :       real(dp) :: q1
    1092              :       real(dp) :: q0
    1093        64124 :       q0 = powm1(ln10)
    1094        64124 :       q1 = q0*powm1(x%val)
    1095        64124 :       q2 = x%d2val1*x%val
    1096        64124 :       q3 = pow2(x%d1val1)
    1097        64124 :       q4 = pow2(x%val)
    1098        64124 :       q5 = q0*powm1(q4)
    1099        64124 :       q6 = x%d1val1_d1val2*x%val
    1100        64124 :       q7 = x%d2val2*x%val
    1101        64124 :       q8 = pow2(x%d1val2)
    1102        64124 :       q9 = q0*powm1(pow3(x%val))
    1103        64124 :       q10 = 2.0_dp*x%d1val2
    1104        64124 :       unary%val = q0*log(x%val)
    1105        64124 :       unary%d1val1 = q1*x%d1val1
    1106        64124 :       unary%d1val2 = q1*x%d1val2
    1107        64124 :       unary%d2val1 = q5*(q2 - q3)
    1108        64124 :       unary%d1val1_d1val2 = q5*(q6 - x%d1val1*x%d1val2)
    1109        64124 :       unary%d2val2 = q5*(q7 - q8)
    1110        64124 :       unary%d3val1 = q9*(-3.0_dp*q2*x%d1val1 + 2.0_dp*pow3(x%d1val1) + q4*x%d3val1)
    1111        64124 :       unary%d2val1_d1val2 = q9*(-2.0_dp*q6*x%d1val1 + q10*q3 - q2*x%d1val2 + q4*x%d2val1_d1val2)
    1112        64124 :       unary%d1val1_d2val2 = q9*(-q10*q6 + q4*x%d1val1_d2val2 + x%d1val1*(2.0_dp*q8 - q7))
    1113        64124 :       unary%d3val2 = q9*(-3.0_dp*q7*x%d1val2 + 2.0_dp*pow3(x%d1val2) + q4*x%d3val2)
    1114        64124 :    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              :       real(dp) :: q10
    1120              :       real(dp) :: q9
    1121              :       real(dp) :: q8
    1122              :       real(dp) :: q7
    1123              :       real(dp) :: q6
    1124              :       real(dp) :: q5
    1125              :       real(dp) :: q4
    1126              :       real(dp) :: q3
    1127              :       real(dp) :: q2
    1128              :       real(dp) :: q1
    1129              :       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              :       real(dp) :: q10
    1157              :       real(dp) :: q9
    1158              :       real(dp) :: q8
    1159              :       real(dp) :: q7
    1160              :       real(dp) :: q6
    1161              :       real(dp) :: q5
    1162              :       real(dp) :: q4
    1163              :       real(dp) :: q3
    1164              :       real(dp) :: q2
    1165              :       real(dp) :: q1
    1166              :       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              :       real(dp) :: q8
    1194              :       real(dp) :: q7
    1195              :       real(dp) :: q6
    1196              :       real(dp) :: q5
    1197              :       real(dp) :: q4
    1198              :       real(dp) :: q3
    1199              :       real(dp) :: q2
    1200              :       real(dp) :: q1
    1201              :       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              :       real(dp) :: q8
    1227              :       real(dp) :: q7
    1228              :       real(dp) :: q6
    1229              :       real(dp) :: q5
    1230              :       real(dp) :: q4
    1231              :       real(dp) :: q3
    1232              :       real(dp) :: q2
    1233              :       real(dp) :: q1
    1234              :       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              :       real(dp) :: q15
    1260              :       real(dp) :: q14
    1261              :       real(dp) :: q13
    1262              :       real(dp) :: q12
    1263              :       real(dp) :: q11
    1264              :       real(dp) :: q10
    1265              :       real(dp) :: q9
    1266              :       real(dp) :: q8
    1267              :       real(dp) :: q7
    1268              :       real(dp) :: q6
    1269              :       real(dp) :: q5
    1270              :       real(dp) :: q4
    1271              :       real(dp) :: q3
    1272              :       real(dp) :: q2
    1273              :       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              :       real(dp) :: q11
    1307              :       real(dp) :: q10
    1308              :       real(dp) :: q9
    1309              :       real(dp) :: q8
    1310              :       real(dp) :: q7
    1311              :       real(dp) :: q6
    1312              :       real(dp) :: q5
    1313              :       real(dp) :: q4
    1314              :       real(dp) :: q3
    1315              :       real(dp) :: q2
    1316              :       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              :       real(dp) :: q11
    1346              :       real(dp) :: q10
    1347              :       real(dp) :: q9
    1348              :       real(dp) :: q8
    1349              :       real(dp) :: q7
    1350              :       real(dp) :: q6
    1351              :       real(dp) :: q5
    1352              :       real(dp) :: q4
    1353              :       real(dp) :: q3
    1354              :       real(dp) :: q2
    1355              :       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              :       real(dp) :: q21
    1385              :       real(dp) :: q20
    1386              :       real(dp) :: q19
    1387              :       real(dp) :: q18
    1388              :       real(dp) :: q17
    1389              :       real(dp) :: q16
    1390              :       real(dp) :: q15
    1391              :       real(dp) :: q14
    1392              :       real(dp) :: q13
    1393              :       real(dp) :: q12
    1394              :       real(dp) :: q11
    1395              :       real(dp) :: q10
    1396              :       real(dp) :: q9
    1397              :       real(dp) :: q8
    1398              :       real(dp) :: q7
    1399              :       real(dp) :: q6
    1400              :       real(dp) :: q5
    1401              :       real(dp) :: q4
    1402              :       real(dp) :: q3
    1403              :       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        63902 :    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              :       real(dp) :: q8
    1444              :       real(dp) :: q7
    1445              :       real(dp) :: q6
    1446              :       real(dp) :: q5
    1447              :       real(dp) :: q4
    1448              :       real(dp) :: q3
    1449              :       real(dp) :: q2
    1450              :       real(dp) :: q1
    1451              :       real(dp) :: q0
    1452        63902 :       q0 = sinh(x%val)
    1453        63902 :       q1 = cosh(x%val)
    1454        63902 :       q2 = q1*x%d1val2
    1455        63902 :       q3 = pow2(x%d1val1)
    1456        63902 :       q4 = q0*x%d1val2
    1457        63902 :       q5 = pow2(x%d1val2)
    1458        63902 :       q6 = q0*x%d1val1
    1459        63902 :       q7 = 2.0_dp*x%d1val1_d1val2
    1460        63902 :       q8 = q0*x%d2val2
    1461        63902 :       unary%val = q0
    1462        63902 :       unary%d1val1 = q1*x%d1val1
    1463        63902 :       unary%d1val2 = q2
    1464        63902 :       unary%d2val1 = q0*q3 + q1*x%d2val1
    1465        63902 :       unary%d1val1_d1val2 = q1*x%d1val1_d1val2 + q4*x%d1val1
    1466        63902 :       unary%d2val2 = q0*q5 + q1*x%d2val2
    1467        63902 :       unary%d3val1 = 3.0_dp*q6*x%d2val1 + q1*x%d3val1 + q1*pow3(x%d1val1)
    1468        63902 :       unary%d2val1_d1val2 = q1*x%d2val1_d1val2 + q2*q3 + q4*x%d2val1 + q6*q7
    1469        63902 :       unary%d1val1_d2val2 = q1*x%d1val1_d2val2 + q4*q7 + x%d1val1*(q1*q5 + q8)
    1470        63902 :       unary%d3val2 = 3.0_dp*q8*x%d1val2 + q1*x%d3val2 + q1*pow3(x%d1val2)
    1471        63902 :    end function sinh_self
    1472              : 
    1473        63902 :    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              :       real(dp) :: q8
    1477              :       real(dp) :: q7
    1478              :       real(dp) :: q6
    1479              :       real(dp) :: q5
    1480              :       real(dp) :: q4
    1481              :       real(dp) :: q3
    1482              :       real(dp) :: q2
    1483              :       real(dp) :: q1
    1484              :       real(dp) :: q0
    1485        63902 :       q0 = cosh(x%val)
    1486        63902 :       q1 = sinh(x%val)
    1487        63902 :       q2 = q1*x%d1val2
    1488        63902 :       q3 = pow2(x%d1val1)
    1489        63902 :       q4 = q0*x%d1val2
    1490        63902 :       q5 = pow2(x%d1val2)
    1491        63902 :       q6 = q0*x%d1val1
    1492        63902 :       q7 = 2.0_dp*x%d1val1_d1val2
    1493        63902 :       q8 = q0*x%d2val2
    1494        63902 :       unary%val = q0
    1495        63902 :       unary%d1val1 = q1*x%d1val1
    1496        63902 :       unary%d1val2 = q2
    1497        63902 :       unary%d2val1 = q0*q3 + q1*x%d2val1
    1498        63902 :       unary%d1val1_d1val2 = q1*x%d1val1_d1val2 + q4*x%d1val1
    1499        63902 :       unary%d2val2 = q0*q5 + q1*x%d2val2
    1500        63902 :       unary%d3val1 = 3.0_dp*q6*x%d2val1 + q1*x%d3val1 + q1*pow3(x%d1val1)
    1501        63902 :       unary%d2val1_d1val2 = q1*x%d2val1_d1val2 + q2*q3 + q4*x%d2val1 + q6*q7
    1502        63902 :       unary%d1val1_d2val2 = q1*x%d1val1_d2val2 + q4*q7 + x%d1val1*(q1*q5 + q8)
    1503        63902 :       unary%d3val2 = 3.0_dp*q8*x%d1val2 + q1*x%d3val2 + q1*pow3(x%d1val2)
    1504        63902 :    end function cosh_self
    1505              : 
    1506       211266 :    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              :       real(dp) :: q15
    1510              :       real(dp) :: q14
    1511              :       real(dp) :: q13
    1512              :       real(dp) :: q12
    1513              :       real(dp) :: q11
    1514              :       real(dp) :: q10
    1515              :       real(dp) :: q9
    1516              :       real(dp) :: q8
    1517              :       real(dp) :: q7
    1518              :       real(dp) :: q6
    1519              :       real(dp) :: q5
    1520              :       real(dp) :: q4
    1521              :       real(dp) :: q3
    1522              :       real(dp) :: q2
    1523              :       real(dp) :: q1
    1524              :       real(dp) :: q0
    1525       211266 :       q0 = tanh(x%val)
    1526       211266 :       q1 = pow2(q0)
    1527       211266 :       q2 = q1 - 1
    1528       211266 :       q3 = powm1(pow2(cosh(x%val)))
    1529       211266 :       q4 = pow2(x%d1val1)
    1530       211266 :       q5 = 2.0_dp*q0
    1531       211266 :       q6 = q4*q5 - x%d2val1
    1532       211266 :       q7 = q5*x%d1val2
    1533       211266 :       q8 = pow2(x%d1val2)
    1534       211266 :       q9 = pow3(x%d1val1)
    1535       211266 :       q10 = q0*x%d1val1
    1536       211266 :       q11 = 6.0_dp*q1
    1537       211266 :       q12 = 4.0_dp*x%d1val1_d1val2
    1538       211266 :       q13 = q8*x%d1val1
    1539       211266 :       q14 = q0*x%d1val2
    1540       211266 :       q15 = pow3(x%d1val2)
    1541       211266 :       unary%val = q0
    1542       211266 :       unary%d1val1 = -q2*x%d1val1
    1543       211266 :       unary%d1val2 = -q2*x%d1val2
    1544       211266 :       unary%d2val1 = -q3*q6
    1545       211266 :       unary%d1val1_d1val2 = -q3*(q7*x%d1val1 - x%d1val1_d1val2)
    1546       211266 :       unary%d2val2 = -q3*(q5*q8 - x%d2val2)
    1547       211266 :       unary%d3val1 = q3*(-2.0_dp*q9 - 6.0_dp*q10*x%d2val1 + q11*q9 + x%d3val1)
    1548       211266 :       unary%d2val1_d1val2 = -q3*(2.0_dp*q3*q4*x%d1val2 + q10*q12 - q6*q7 - x%d2val1_d1val2)
    1549       211266 :       unary%d1val1_d2val2 = -q3*(2.0_dp*q13 - q11*q13 + q12*q14 + q5*x%d1val1*x%d2val2 - x%d1val1_d2val2)
    1550       211266 :       unary%d3val2 = q3*(-2.0_dp*q15 - 6.0_dp*q14*x%d2val2 + q11*q15 + x%d3val2)
    1551       211266 :    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              :       real(dp) :: q15
    1557              :       real(dp) :: q14
    1558              :       real(dp) :: q13
    1559              :       real(dp) :: q12
    1560              :       real(dp) :: q11
    1561              :       real(dp) :: q10
    1562              :       real(dp) :: q9
    1563              :       real(dp) :: q8
    1564              :       real(dp) :: q7
    1565              :       real(dp) :: q6
    1566              :       real(dp) :: q5
    1567              :       real(dp) :: q4
    1568              :       real(dp) :: q3
    1569              :       real(dp) :: q2
    1570              :       real(dp) :: q1
    1571              :       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              :       real(dp) :: q17
    1605              :       real(dp) :: q16
    1606              :       real(dp) :: q15
    1607              :       real(dp) :: q14
    1608              :       real(dp) :: q13
    1609              :       real(dp) :: q12
    1610              :       real(dp) :: q11
    1611              :       real(dp) :: q10
    1612              :       real(dp) :: q9
    1613              :       real(dp) :: q8
    1614              :       real(dp) :: q7
    1615              :       real(dp) :: q6
    1616              :       real(dp) :: q5
    1617              :       real(dp) :: q4
    1618              :       real(dp) :: q3
    1619              :       real(dp) :: q2
    1620              :       real(dp) :: q1
    1621              :       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       275390 :    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              :       real(dp) :: q17
    1657              :       real(dp) :: q16
    1658              :       real(dp) :: q15
    1659              :       real(dp) :: q14
    1660              :       real(dp) :: q13
    1661              :       real(dp) :: q12
    1662              :       real(dp) :: q11
    1663              :       real(dp) :: q10
    1664              :       real(dp) :: q9
    1665              :       real(dp) :: q8
    1666              :       real(dp) :: q7
    1667              :       real(dp) :: q6
    1668              :       real(dp) :: q5
    1669              :       real(dp) :: q4
    1670              :       real(dp) :: q3
    1671              :       real(dp) :: q2
    1672              :       real(dp) :: q1
    1673              :       real(dp) :: q0
    1674       275390 :       q0 = pow2(x%val)
    1675       275390 :       q1 = q0 + 1
    1676       275390 :       q2 = powm1(q1)
    1677       275390 :       q3 = pow2(q1)
    1678       275390 :       q4 = powm1(q3)
    1679       275390 :       q5 = pow2(x%d1val1)
    1680       275390 :       q6 = 2.0_dp*x%val
    1681       275390 :       q7 = q5*q6
    1682       275390 :       q8 = q1*x%d2val1
    1683       275390 :       q9 = x%d1val1*x%d1val2
    1684       275390 :       q10 = q1*x%d1val1_d1val2
    1685       275390 :       q11 = pow2(x%d1val2)
    1686       275390 :       q12 = powm1(pow3(q1))
    1687       275390 :       q13 = 8.0_dp*q0
    1688       275390 :       q14 = 2.0_dp*x%d1val1
    1689       275390 :       q15 = q1*q14
    1690       275390 :       q16 = 4.0_dp*q0
    1691       275390 :       q17 = x%d2val2*x%val
    1692       275390 :       unary%val = atan(x%val)
    1693       275390 :       unary%d1val1 = q2*x%d1val1
    1694       275390 :       unary%d1val2 = q2*x%d1val2
    1695       275390 :       unary%d2val1 = q4*(-q7 + q8)
    1696       275390 :       unary%d1val1_d1val2 = q4*(q10 - q6*q9)
    1697       275390 :       unary%d2val2 = q4*(q1*x%d2val2 - q11*q6)
    1698       275390 :       unary%d3val1 = q12*(q13*pow3(x%d1val1) - q15*(3.0_dp*x%d2val1*x%val + q5) + q3*x%d3val1)
    1699       275390 :       unary%d2val1_d1val2 = q12*(-q15*(q6*x%d1val1_d1val2 + q9) + q16*q5*x%d1val2 + q3*x%d2val1_d1val2 + q6*x%d1val2*(q7 - q8))
    1700       275390 :       unary%d1val1_d2val2 = q12*(-4.0_dp*q10*x%d1val2*x%val - q14*(q1*(q11 + q17) - q11*q16) + q3*x%d1val1_d2val2)
    1701       275390 :       unary%d3val2 = q12*(-2.0_dp*q1*x%d1val2*(3.0_dp*q17 + q11) + q13*pow3(x%d1val2) + q3*x%d3val2)
    1702       275390 :    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              :       real(dp) :: q18
    1708              :       real(dp) :: q17
    1709              :       real(dp) :: q16
    1710              :       real(dp) :: q15
    1711              :       real(dp) :: q14
    1712              :       real(dp) :: q13
    1713              :       real(dp) :: q12
    1714              :       real(dp) :: q11
    1715              :       real(dp) :: q10
    1716              :       real(dp) :: q9
    1717              :       real(dp) :: q8
    1718              :       real(dp) :: q7
    1719              :       real(dp) :: q6
    1720              :       real(dp) :: q5
    1721              :       real(dp) :: q4
    1722              :       real(dp) :: q3
    1723              :       real(dp) :: q2
    1724              :       real(dp) :: q1
    1725              :       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              :       real(dp) :: q20
    1762              :       real(dp) :: q19
    1763              :       real(dp) :: q18
    1764              :       real(dp) :: q17
    1765              :       real(dp) :: q16
    1766              :       real(dp) :: q15
    1767              :       real(dp) :: q14
    1768              :       real(dp) :: q13
    1769              :       real(dp) :: q12
    1770              :       real(dp) :: q11
    1771              :       real(dp) :: q10
    1772              :       real(dp) :: q9
    1773              :       real(dp) :: q8
    1774              :       real(dp) :: q7
    1775              :       real(dp) :: q6
    1776              :       real(dp) :: q5
    1777              :       real(dp) :: q4
    1778              :       real(dp) :: q3
    1779              :       real(dp) :: q2
    1780              :       real(dp) :: q1
    1781              :       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              :       real(dp) :: q24
    1820              :       real(dp) :: q23
    1821              :       real(dp) :: q22
    1822              :       real(dp) :: q21
    1823              :       real(dp) :: q20
    1824              :       real(dp) :: q19
    1825              :       real(dp) :: q18
    1826              :       real(dp) :: q17
    1827              :       real(dp) :: q16
    1828              :       real(dp) :: q15
    1829              :       real(dp) :: q14
    1830              :       real(dp) :: q13
    1831              :       real(dp) :: q12
    1832              :       real(dp) :: q11
    1833              :       real(dp) :: q10
    1834              :       real(dp) :: q9
    1835              :       real(dp) :: q8
    1836              :       real(dp) :: q7
    1837              :       real(dp) :: q6
    1838              :       real(dp) :: q5
    1839              :       real(dp) :: q4
    1840              :       real(dp) :: q3
    1841              :       real(dp) :: q2
    1842              :       real(dp) :: q1
    1843              :       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              :       real(dp) :: q15
    1889              :       real(dp) :: q14
    1890              :       real(dp) :: q13
    1891              :       real(dp) :: q12
    1892              :       real(dp) :: q11
    1893              :       real(dp) :: q10
    1894              :       real(dp) :: q9
    1895              :       real(dp) :: q8
    1896              :       real(dp) :: q7
    1897              :       real(dp) :: q6
    1898              :       real(dp) :: q5
    1899              :       real(dp) :: q4
    1900              :       real(dp) :: q3
    1901              :       real(dp) :: q2
    1902              :       real(dp) :: q1
    1903              :       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              :       real(dp) :: q15
    1937              :       real(dp) :: q14
    1938              :       real(dp) :: q13
    1939              :       real(dp) :: q12
    1940              :       real(dp) :: q11
    1941              :       real(dp) :: q10
    1942              :       real(dp) :: q9
    1943              :       real(dp) :: q8
    1944              :       real(dp) :: q7
    1945              :       real(dp) :: q6
    1946              :       real(dp) :: q5
    1947              :       real(dp) :: q4
    1948              :       real(dp) :: q3
    1949              :       real(dp) :: q2
    1950              :       real(dp) :: q1
    1951              :       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              :       real(dp) :: q17
    1985              :       real(dp) :: q16
    1986              :       real(dp) :: q15
    1987              :       real(dp) :: q14
    1988              :       real(dp) :: q13
    1989              :       real(dp) :: q12
    1990              :       real(dp) :: q11
    1991              :       real(dp) :: q10
    1992              :       real(dp) :: q9
    1993              :       real(dp) :: q8
    1994              :       real(dp) :: q7
    1995              :       real(dp) :: q6
    1996              :       real(dp) :: q5
    1997              :       real(dp) :: q4
    1998              :       real(dp) :: q3
    1999              :       real(dp) :: q2
    2000              :       real(dp) :: q1
    2001              :       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      4808162 :    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              :       real(dp) :: q12
    2036              :       real(dp) :: q11
    2037              :       real(dp) :: q10
    2038              :       real(dp) :: q9
    2039              :       real(dp) :: q8
    2040              :       real(dp) :: q7
    2041              :       real(dp) :: q6
    2042              :       real(dp) :: q5
    2043              :       real(dp) :: q4
    2044              :       real(dp) :: q3
    2045              :       real(dp) :: q2
    2046              :       real(dp) :: q1
    2047              :       real(dp) :: q0
    2048      4808162 :       q0 = sqrt(x%val)
    2049      4808162 :       q1 = 0.5_dp*powm1(q0)
    2050      4808162 :       q2 = 2.0_dp*x%val
    2051      4808162 :       q3 = q2*x%d2val1
    2052      4808162 :       q4 = pow2(x%d1val1)
    2053      4808162 :       q5 = 0.25_dp*powm1(pow3(sqrt(x%val)))
    2054      4808162 :       q6 = q2*x%d2val2
    2055      4808162 :       q7 = pow2(x%d1val2)
    2056      4808162 :       q8 = x%d1val1*x%val
    2057      4808162 :       q9 = 4.0_dp*pow2(x%val)
    2058      4808162 :       q10 = 0.125_dp*powm1(pow5(sqrt(x%val)))
    2059      4808162 :       q11 = 4.0_dp*x%d1val1_d1val2
    2060      4808162 :       q12 = x%d1val2*x%val
    2061      4808162 :       unary%val = q0
    2062      4808162 :       unary%d1val1 = q1*x%d1val1
    2063      4808162 :       unary%d1val2 = q1*x%d1val2
    2064      4808162 :       unary%d2val1 = q5*(q3 - q4)
    2065      4808162 :       unary%d1val1_d1val2 = q5*(q2*x%d1val1_d1val2 - x%d1val1*x%d1val2)
    2066      4808162 :       unary%d2val2 = q5*(q6 - q7)
    2067      4808162 :       unary%d3val1 = q10*(-6.0_dp*q8*x%d2val1 + 3.0_dp*pow3(x%d1val1) + q9*x%d3val1)
    2068      4808162 :       unary%d2val1_d1val2 = q10*(3.0_dp*q4*x%d1val2 - q11*q8 - q3*x%d1val2 + q9*x%d2val1_d1val2)
    2069      4808162 :       unary%d1val1_d2val2 = q10*(-q11*q12 + q9*x%d1val1_d2val2 + x%d1val1*(3.0_dp*q7 - q6))
    2070      4808162 :       unary%d3val2 = q10*(-6.0_dp*q12*x%d2val2 + 3.0_dp*pow3(x%d1val2) + q9*x%d3val2)
    2071      4808162 :    end function sqrt_self
    2072              : 
    2073      4078178 :    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              :       real(dp) :: q2
    2077              :       real(dp) :: q1
    2078              :       real(dp) :: q0
    2079      4078178 :       q0 = 2.0_dp*x%val
    2080      4078178 :       q1 = 2.0_dp*x%d1val2
    2081      4078178 :       q2 = 4.0_dp*x%d1val1_d1val2
    2082      4078178 :       unary%val = pow2(x%val)
    2083      4078178 :       unary%d1val1 = q0*x%d1val1
    2084      4078178 :       unary%d1val2 = q0*x%d1val2
    2085      4078178 :       unary%d2val1 = 2.0_dp*pow2(x%d1val1) + q0*x%d2val1
    2086      4078178 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2 + q1*x%d1val1
    2087      4078178 :       unary%d2val2 = 2.0_dp*pow2(x%d1val2) + q0*x%d2val2
    2088      4078178 :       unary%d3val1 = 6.0_dp*x%d1val1*x%d2val1 + q0*x%d3val1
    2089      4078178 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2 + q1*x%d2val1 + q2*x%d1val1
    2090      4078178 :       unary%d1val1_d2val2 = 2.0_dp*x%d1val1*x%d2val2 + q0*x%d1val1_d2val2 + q2*x%d1val2
    2091      4078178 :       unary%d3val2 = 6.0_dp*x%d1val2*x%d2val2 + q0*x%d3val2
    2092      4078178 :    end function pow2_self
    2093              : 
    2094      1299658 :    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              :       real(dp) :: q6
    2098              :       real(dp) :: q5
    2099              :       real(dp) :: q4
    2100              :       real(dp) :: q3
    2101              :       real(dp) :: q2
    2102              :       real(dp) :: q1
    2103              :       real(dp) :: q0
    2104      1299658 :       q0 = 3.0_dp*pow2(x%val)
    2105      1299658 :       q1 = x%d2val1*x%val
    2106      1299658 :       q2 = 2.0_dp*pow2(x%d1val1) + q1
    2107      1299658 :       q3 = 3.0_dp*x%val
    2108      1299658 :       q4 = x%d1val1_d1val2*x%val
    2109      1299658 :       q5 = x%d2val2*x%val
    2110      1299658 :       q6 = pow2(x%d1val2)
    2111      1299658 :       unary%val = pow3(x%val)
    2112      1299658 :       unary%d1val1 = q0*x%d1val1
    2113      1299658 :       unary%d1val2 = q0*x%d1val2
    2114      1299658 :       unary%d2val1 = q2*q3
    2115      1299658 :       unary%d1val1_d1val2 = q3*(2.0_dp*x%d1val1*x%d1val2 + q4)
    2116      1299658 :       unary%d2val2 = q3*(2.0_dp*q6 + q5)
    2117      1299658 :       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      1299658 :                             + q3*(4.0_dp*x%d1val1*x%d1val1_d1val2 + x%d1val2*x%d2val1 + x%d2val1_d1val2*x%val)
    2120      1299658 :       unary%d1val1_d2val2 = 12.0_dp*q4*x%d1val2 + 6.0_dp*x%d1val1*(q5 + q6) + q0*x%d1val1_d2val2
    2121      1299658 :       unary%d3val2 = 18.0_dp*q5*x%d1val2 + 6.0_dp*pow3(x%d1val2) + q0*x%d3val2
    2122      1299658 :    end function pow3_self
    2123              : 
    2124        96186 :    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              :       real(dp) :: q9
    2128              :       real(dp) :: q8
    2129              :       real(dp) :: q7
    2130              :       real(dp) :: q6
    2131              :       real(dp) :: q5
    2132              :       real(dp) :: q4
    2133              :       real(dp) :: q3
    2134              :       real(dp) :: q2
    2135              :       real(dp) :: q1
    2136              :       real(dp) :: q0
    2137        96186 :       q0 = 4.0_dp*pow3(x%val)
    2138        96186 :       q1 = x%d2val1*x%val
    2139        96186 :       q2 = 3.0_dp*pow2(x%d1val1) + q1
    2140        96186 :       q3 = pow2(x%val)
    2141        96186 :       q4 = 4.0_dp*q3
    2142        96186 :       q5 = x%d1val1_d1val2*x%val
    2143        96186 :       q6 = 3.0_dp*x%d1val1
    2144        96186 :       q7 = x%d2val2*x%val
    2145        96186 :       q8 = pow2(x%d1val2)
    2146        96186 :       q9 = 4.0_dp*x%val
    2147        96186 :       unary%val = pow4(x%val)
    2148        96186 :       unary%d1val1 = q0*x%d1val1
    2149        96186 :       unary%d1val2 = q0*x%d1val2
    2150        96186 :       unary%d2val1 = q2*q4
    2151        96186 :       unary%d1val1_d1val2 = q4*(q5 + q6*x%d1val2)
    2152        96186 :       unary%d2val2 = q4*(3.0_dp*q8 + q7)
    2153        96186 :       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        96186 :                             + x%val*(6.0_dp*x%d1val1*x%d1val1_d1val2 + x%d1val2*x%d2val1 + x%d2val1_d1val2*x%val))
    2156        96186 :       unary%d1val1_d2val2 = q9*(6.0_dp*q5*x%d1val2 + q3*x%d1val1_d2val2 + q6*(2.0_dp*q8 + q7))
    2157        96186 :       unary%d3val2 = q9*(6.0_dp*pow3(x%d1val2) + 9.0_dp*q7*x%d1val2 + q3*x%d3val2)
    2158        96186 :    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              :       real(dp) :: q9
    2164              :       real(dp) :: q8
    2165              :       real(dp) :: q7
    2166              :       real(dp) :: q6
    2167              :       real(dp) :: q5
    2168              :       real(dp) :: q4
    2169              :       real(dp) :: q3
    2170              :       real(dp) :: q2
    2171              :       real(dp) :: q1
    2172              :       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              :       real(dp) :: q9
    2200              :       real(dp) :: q8
    2201              :       real(dp) :: q7
    2202              :       real(dp) :: q6
    2203              :       real(dp) :: q5
    2204              :       real(dp) :: q4
    2205              :       real(dp) :: q3
    2206              :       real(dp) :: q2
    2207              :       real(dp) :: q1
    2208              :       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              :       real(dp) :: q9
    2236              :       real(dp) :: q8
    2237              :       real(dp) :: q7
    2238              :       real(dp) :: q6
    2239              :       real(dp) :: q5
    2240              :       real(dp) :: q4
    2241              :       real(dp) :: q3
    2242              :       real(dp) :: q2
    2243              :       real(dp) :: q1
    2244              :       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              :       real(dp) :: q9
    2272              :       real(dp) :: q8
    2273              :       real(dp) :: q7
    2274              :       real(dp) :: q6
    2275              :       real(dp) :: q5
    2276              :       real(dp) :: q4
    2277              :       real(dp) :: q3
    2278              :       real(dp) :: q2
    2279              :       real(dp) :: q1
    2280              :       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        32062 :    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              :       real(dp) :: q0
    2308        32062 :       q0 = sgn(x%val)
    2309        32062 :       unary%val = Abs(x%val)
    2310        32062 :       unary%d1val1 = q0*x%d1val1
    2311        32062 :       unary%d1val2 = q0*x%d1val2
    2312        32062 :       unary%d2val1 = q0*x%d2val1
    2313        32062 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    2314        32062 :       unary%d2val2 = q0*x%d2val2
    2315        32062 :       unary%d3val1 = q0*x%d3val1
    2316        32062 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    2317        32062 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    2318        32062 :       unary%d3val2 = q0*x%d3val2
    2319        32062 :    end function abs_self
    2320              : 
    2321      8049226 :    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      8049226 :       binary%val = x%val + y%val
    2326      8049226 :       binary%d1val1 = x%d1val1 + y%d1val1
    2327      8049226 :       binary%d1val2 = x%d1val2 + y%d1val2
    2328      8049226 :       binary%d2val1 = x%d2val1 + y%d2val1
    2329      8049226 :       binary%d1val1_d1val2 = x%d1val1_d1val2 + y%d1val1_d1val2
    2330      8049226 :       binary%d2val2 = x%d2val2 + y%d2val2
    2331      8049226 :       binary%d3val1 = x%d3val1 + y%d3val1
    2332      8049226 :       binary%d2val1_d1val2 = x%d2val1_d1val2 + y%d2val1_d1val2
    2333      8049226 :       binary%d1val1_d2val2 = x%d1val1_d2val2 + y%d1val1_d2val2
    2334      8049226 :       binary%d3val2 = x%d3val2 + y%d3val2
    2335      8049226 :    end function add_self
    2336              : 
    2337       307452 :    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       307452 :       unary%val = x%val + y
    2342       307452 :       unary%d1val1 = x%d1val1
    2343       307452 :       unary%d1val2 = x%d1val2
    2344       307452 :       unary%d2val1 = x%d2val1
    2345       307452 :       unary%d1val1_d1val2 = x%d1val1_d1val2
    2346       307452 :       unary%d2val2 = x%d2val2
    2347       307452 :       unary%d3val1 = x%d3val1
    2348       307452 :       unary%d2val1_d1val2 = x%d2val1_d1val2
    2349       307452 :       unary%d1val1_d2val2 = x%d1val1_d2val2
    2350       307452 :       unary%d3val2 = x%d3val2
    2351       307452 :    end function add_self_real
    2352              : 
    2353      9712102 :    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      9712102 :       unary%val = x%val + z
    2358      9712102 :       unary%d1val1 = x%d1val1
    2359      9712102 :       unary%d1val2 = x%d1val2
    2360      9712102 :       unary%d2val1 = x%d2val1
    2361      9712102 :       unary%d1val1_d1val2 = x%d1val1_d1val2
    2362      9712102 :       unary%d2val2 = x%d2val2
    2363      9712102 :       unary%d3val1 = x%d3val1
    2364      9712102 :       unary%d2val1_d1val2 = x%d2val1_d1val2
    2365      9712102 :       unary%d1val1_d2val2 = x%d1val1_d2val2
    2366      9712102 :       unary%d3val2 = x%d3val2
    2367      9712102 :    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              :       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       211266 :    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              :       real(dp) :: y_dp
    2392       211266 :       y_dp = z
    2393       211266 :       unary%val = x%val + y_dp
    2394       211266 :       unary%d1val1 = x%d1val1
    2395       211266 :       unary%d1val2 = x%d1val2
    2396       211266 :       unary%d2val1 = x%d2val1
    2397       211266 :       unary%d1val1_d1val2 = x%d1val1_d1val2
    2398       211266 :       unary%d2val2 = x%d2val2
    2399       211266 :       unary%d3val1 = x%d3val1
    2400       211266 :       unary%d2val1_d1val2 = x%d2val1_d1val2
    2401       211266 :       unary%d1val1_d2val2 = x%d1val1_d2val2
    2402       211266 :       unary%d3val2 = x%d3val2
    2403       211266 :    end function add_int_self
    2404              : 
    2405      1767420 :    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      1767420 :       binary%val = x%val - y%val
    2410      1767420 :       binary%d1val1 = x%d1val1 - y%d1val1
    2411      1767420 :       binary%d1val2 = x%d1val2 - y%d1val2
    2412      1767420 :       binary%d2val1 = x%d2val1 - y%d2val1
    2413      1767420 :       binary%d1val1_d1val2 = x%d1val1_d1val2 - y%d1val1_d1val2
    2414      1767420 :       binary%d2val2 = x%d2val2 - y%d2val2
    2415      1767420 :       binary%d3val1 = x%d3val1 - y%d3val1
    2416      1767420 :       binary%d2val1_d1val2 = x%d2val1_d1val2 - y%d2val1_d1val2
    2417      1767420 :       binary%d1val1_d2val2 = x%d1val1_d2val2 - y%d1val1_d2val2
    2418      1767420 :       binary%d3val2 = x%d3val2 - y%d3val2
    2419      1767420 :    end function sub_self
    2420              : 
    2421       550576 :    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       550576 :       unary%val = x%val - y
    2426       550576 :       unary%d1val1 = x%d1val1
    2427       550576 :       unary%d1val2 = x%d1val2
    2428       550576 :       unary%d2val1 = x%d2val1
    2429       550576 :       unary%d1val1_d1val2 = x%d1val1_d1val2
    2430       550576 :       unary%d2val2 = x%d2val2
    2431       550576 :       unary%d3val1 = x%d3val1
    2432       550576 :       unary%d2val1_d1val2 = x%d2val1_d1val2
    2433       550576 :       unary%d1val1_d2val2 = x%d1val1_d2val2
    2434       550576 :       unary%d3val2 = x%d3val2
    2435       550576 :    end function sub_self_real
    2436              : 
    2437      1395640 :    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      1395640 :       unary%val = -x%val + z
    2442      1395640 :       unary%d1val1 = -x%d1val1
    2443      1395640 :       unary%d1val2 = -x%d1val2
    2444      1395640 :       unary%d2val1 = -x%d2val1
    2445      1395640 :       unary%d1val1_d1val2 = -x%d1val1_d1val2
    2446      1395640 :       unary%d2val2 = -x%d2val2
    2447      1395640 :       unary%d3val1 = -x%d3val1
    2448      1395640 :       unary%d2val1_d1val2 = -x%d2val1_d1val2
    2449      1395640 :       unary%d1val1_d2val2 = -x%d1val1_d2val2
    2450      1395640 :       unary%d3val2 = -x%d3val2
    2451      1395640 :    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              :       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              :       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     10296048 :    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              :       real(dp) :: q1
    2494              :       real(dp) :: q0
    2495     10296048 :       q0 = 2.0_dp*x%d1val1
    2496     10296048 :       q1 = 2.0_dp*y%d1val2
    2497     10296048 :       binary%val = x%val*y%val
    2498     10296048 :       binary%d1val1 = x%d1val1*y%val + x%val*y%d1val1
    2499     10296048 :       binary%d1val2 = x%d1val2*y%val + x%val*y%d1val2
    2500     10296048 :       binary%d2val1 = q0*y%d1val1 + x%d2val1*y%val + x%val*y%d2val1
    2501     10296048 :       binary%d1val1_d1val2 = x%d1val1*y%d1val2 + x%d1val1_d1val2*y%val + x%d1val2*y%d1val1 + x%val*y%d1val1_d1val2
    2502     10296048 :       binary%d2val2 = q1*x%d1val2 + x%d2val2*y%val + x%val*y%d2val2
    2503     10296048 :       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     10296048 :                              + 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     10296048 :                              + x%d1val1*y%d2val2 + x%d1val1_d2val2*y%val + x%d2val2*y%d1val1 + x%val*y%d1val1_d2val2
    2508     10296048 :       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     10296048 :    end function mul_self
    2510              : 
    2511      3963606 :    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      3963606 :       unary%val = x%val*y
    2516      3963606 :       unary%d1val1 = x%d1val1*y
    2517      3963606 :       unary%d1val2 = x%d1val2*y
    2518      3963606 :       unary%d2val1 = x%d2val1*y
    2519      3963606 :       unary%d1val1_d1val2 = x%d1val1_d1val2*y
    2520      3963606 :       unary%d2val2 = x%d2val2*y
    2521      3963606 :       unary%d3val1 = x%d3val1*y
    2522      3963606 :       unary%d2val1_d1val2 = x%d2val1_d1val2*y
    2523      3963606 :       unary%d1val1_d2val2 = x%d1val1_d2val2*y
    2524      3963606 :       unary%d3val2 = x%d3val2*y
    2525      3963606 :    end function mul_self_real
    2526              : 
    2527     14560480 :    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     14560480 :       unary%val = x%val*z
    2532     14560480 :       unary%d1val1 = x%d1val1*z
    2533     14560480 :       unary%d1val2 = x%d1val2*z
    2534     14560480 :       unary%d2val1 = x%d2val1*z
    2535     14560480 :       unary%d1val1_d1val2 = x%d1val1_d1val2*z
    2536     14560480 :       unary%d2val2 = x%d2val2*z
    2537     14560480 :       unary%d3val1 = x%d3val1*z
    2538     14560480 :       unary%d2val1_d1val2 = x%d2val1_d1val2*z
    2539     14560480 :       unary%d1val1_d2val2 = x%d1val1_d2val2*z
    2540     14560480 :       unary%d3val2 = x%d3val2*z
    2541     14560480 :    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              :       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              :       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      6486004 :    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              :       real(dp) :: q22
    2584              :       real(dp) :: q21
    2585              :       real(dp) :: q20
    2586              :       real(dp) :: q19
    2587              :       real(dp) :: q18
    2588              :       real(dp) :: q17
    2589              :       real(dp) :: q16
    2590              :       real(dp) :: q15
    2591              :       real(dp) :: q14
    2592              :       real(dp) :: q13
    2593              :       real(dp) :: q12
    2594              :       real(dp) :: q11
    2595              :       real(dp) :: q10
    2596              :       real(dp) :: q9
    2597              :       real(dp) :: q8
    2598              :       real(dp) :: q7
    2599              :       real(dp) :: q6
    2600              :       real(dp) :: q5
    2601              :       real(dp) :: q4
    2602              :       real(dp) :: q3
    2603              :       real(dp) :: q2
    2604              :       real(dp) :: q1
    2605              :       real(dp) :: q0
    2606      6486004 :       q0 = pow2(y%val)
    2607      6486004 :       q1 = powm1(q0)
    2608      6486004 :       q2 = x%d1val1*y%val
    2609      6486004 :       q3 = x%val*y%d1val1
    2610      6486004 :       q4 = x%d1val2*y%val
    2611      6486004 :       q5 = x%val*y%d1val2
    2612      6486004 :       q6 = pow3(y%val)
    2613      6486004 :       q7 = powm1(q6)
    2614      6486004 :       q8 = q0*x%d2val1
    2615      6486004 :       q9 = 2.0_dp*y%d1val1
    2616      6486004 :       q10 = y%d2val1*y%val
    2617      6486004 :       q11 = pow2(y%d1val1)
    2618      6486004 :       q12 = 2.0_dp*q11
    2619      6486004 :       q13 = -q10 + q12
    2620      6486004 :       q14 = q0*x%d1val1_d1val2
    2621      6486004 :       q15 = 2.0_dp*y%d1val2
    2622      6486004 :       q16 = x%d1val2*y%d1val1
    2623      6486004 :       q17 = q0*x%d2val2
    2624      6486004 :       q18 = y%d2val2*y%val
    2625      6486004 :       q19 = pow2(y%d1val2)
    2626      6486004 :       q20 = 2.0_dp*q19 - q18
    2627      6486004 :       q21 = powm1(pow4(y%val))
    2628      6486004 :       q22 = 2.0_dp*y%d1val1_d1val2
    2629      6486004 :       binary%val = x%val*powm1(y%val)
    2630      6486004 :       binary%d1val1 = q1*(q2 - q3)
    2631      6486004 :       binary%d1val2 = q1*(q4 - q5)
    2632      6486004 :       binary%d2val1 = q7*(q13*x%val - q2*q9 + q8)
    2633      6486004 :       binary%d1val1_d1val2 = q7*(q14 + q15*q3 - y%val*(q16 + x%d1val1*y%d1val2 + x%val*y%d1val1_d1val2))
    2634      6486004 :       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      6486004 :                            - 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      6486004 :                            - 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      6486004 :                            + q6*x%d1val1_d2val2)
    2644              :       binary%d3val2 = q21*(-3.0_dp*q17*y%d1val2 + 3.0_dp*q20*q4 &
    2645      6486004 :                       + q6*x%d3val2 - x%val*(-6.0_dp*q18*y%d1val2 + 6.0_dp*pow3(y%d1val2) + q0*y%d3val2))
    2646      6486004 :    end function div_self
    2647              : 
    2648      2369156 :    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              :       real(dp) :: q0
    2653      2369156 :       q0 = powm1(y)
    2654      2369156 :       unary%val = q0*x%val
    2655      2369156 :       unary%d1val1 = q0*x%d1val1
    2656      2369156 :       unary%d1val2 = q0*x%d1val2
    2657      2369156 :       unary%d2val1 = q0*x%d2val1
    2658      2369156 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    2659      2369156 :       unary%d2val2 = q0*x%d2val2
    2660      2369156 :       unary%d3val1 = q0*x%d3val1
    2661      2369156 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    2662      2369156 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    2663      2369156 :       unary%d3val2 = q0*x%d3val2
    2664      2369156 :    end function div_self_real
    2665              : 
    2666      3277696 :    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              :       real(dp) :: q12
    2671              :       real(dp) :: q11
    2672              :       real(dp) :: q10
    2673              :       real(dp) :: q9
    2674              :       real(dp) :: q8
    2675              :       real(dp) :: q7
    2676              :       real(dp) :: q6
    2677              :       real(dp) :: q5
    2678              :       real(dp) :: q4
    2679              :       real(dp) :: q3
    2680              :       real(dp) :: q2
    2681              :       real(dp) :: q1
    2682              :       real(dp) :: q0
    2683      3277696 :       q0 = pow2(x%val)
    2684      3277696 :       q1 = z*powm1(q0)
    2685      3277696 :       q2 = x%d2val1*x%val
    2686      3277696 :       q3 = pow2(x%d1val1)
    2687      3277696 :       q4 = z*powm1(pow3(x%val))
    2688      3277696 :       q5 = 2.0_dp*x%d1val1
    2689      3277696 :       q6 = x%d1val1_d1val2*x%val
    2690      3277696 :       q7 = x%d2val2*x%val
    2691      3277696 :       q8 = -q7
    2692      3277696 :       q9 = pow2(x%d1val2)
    2693      3277696 :       q10 = z*powm1(pow4(x%val))
    2694      3277696 :       q11 = 4.0_dp*q6
    2695      3277696 :       q12 = 6.0_dp*x%d1val2
    2696      3277696 :       unary%val = z*powm1(x%val)
    2697      3277696 :       unary%d1val1 = -q1*x%d1val1
    2698      3277696 :       unary%d1val2 = -q1*x%d1val2
    2699      3277696 :       unary%d2val1 = q4*(2.0_dp*q3 - q2)
    2700      3277696 :       unary%d1val1_d1val2 = q4*(q5*x%d1val2 - q6)
    2701      3277696 :       unary%d2val2 = q4*(2.0_dp*q9 + q8)
    2702      3277696 :       unary%d3val1 = q10*(-6.0_dp*pow3(x%d1val1) + 6.0_dp*q2*x%d1val1 - q0*x%d3val1)
    2703      3277696 :       unary%d2val1_d1val2 = q10*(2.0_dp*q2*x%d1val2 - q0*x%d2val1_d1val2 + q11*x%d1val1 - q12*q3)
    2704      3277696 :       unary%d1val1_d2val2 = -q10*(q0*x%d1val1_d2val2 - q11*x%d1val2 + q5*(3.0_dp*q9 + q8))
    2705      3277696 :       unary%d3val2 = q10*(-6.0_dp*pow3(x%d1val2) - q0*x%d3val2 + q12*q7)
    2706      3277696 :    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              :       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              :       real(dp) :: y_dp
    2733              :       real(dp) :: q12
    2734              :       real(dp) :: q11
    2735              :       real(dp) :: q10
    2736              :       real(dp) :: q9
    2737              :       real(dp) :: q8
    2738              :       real(dp) :: q7
    2739              :       real(dp) :: q6
    2740              :       real(dp) :: q5
    2741              :       real(dp) :: q4
    2742              :       real(dp) :: q3
    2743              :       real(dp) :: q2
    2744              :       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        63716 :    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              :       real(dp) :: q30
    2777              :       real(dp) :: q29
    2778              :       real(dp) :: q28
    2779              :       real(dp) :: q27
    2780              :       real(dp) :: q26
    2781              :       real(dp) :: q25
    2782              :       real(dp) :: q24
    2783              :       real(dp) :: q23
    2784              :       real(dp) :: q22
    2785              :       real(dp) :: q21
    2786              :       real(dp) :: q20
    2787              :       real(dp) :: q19
    2788              :       real(dp) :: q18
    2789              :       real(dp) :: q17
    2790              :       real(dp) :: q16
    2791              :       real(dp) :: q15
    2792              :       real(dp) :: q14
    2793              :       real(dp) :: q13
    2794              :       real(dp) :: q12
    2795              :       real(dp) :: q11
    2796              :       real(dp) :: q10
    2797              :       real(dp) :: q9
    2798              :       real(dp) :: q8
    2799              :       real(dp) :: q7
    2800              :       real(dp) :: q6
    2801              :       real(dp) :: q5
    2802              :       real(dp) :: q4
    2803              :       real(dp) :: q3
    2804              :       real(dp) :: q2
    2805              :       real(dp) :: q1
    2806              :       real(dp) :: q0
    2807        63716 :       q0 = pow(x%val, y%val - 1)
    2808        63716 :       q1 = x%d1val1*y%val
    2809        63716 :       q2 = log(x%val)
    2810        63716 :       q3 = q2*x%val
    2811        63716 :       q4 = q1 + q3*y%d1val1
    2812        63716 :       q5 = x%d1val2*y%val
    2813        63716 :       q6 = q3*y%d1val2 + q5
    2814        63716 :       q7 = pow(x%val, -2.0_dp + y%val)
    2815        63716 :       q8 = pow2(x%d1val1)
    2816        63716 :       q9 = pow2(x%val)
    2817        63716 :       q10 = q2*q9
    2818        63716 :       q11 = x%d2val1*y%val
    2819        63716 :       q12 = x%d1val1*y%d1val1
    2820        63716 :       q13 = q10*y%d2val1 - q8*y%val + x%val*(2.0_dp*q12 + q11)
    2821        63716 :       q14 = q13 + pow2(q4)
    2822        63716 :       q15 = x%d1val1*y%d1val2
    2823        63716 :       q16 = x%d1val2*y%d1val1
    2824        63716 :       q17 = -q1*x%d1val2 + q10*y%d1val1_d1val2 + x%val*(q15 + q16 + x%d1val1_d1val2*y%val)
    2825        63716 :       q18 = pow2(x%d1val2)
    2826        63716 :       q19 = x%d2val2*y%val
    2827        63716 :       q20 = x%d1val2*y%d1val2
    2828        63716 :       q21 = q10*y%d2val2 - q18*y%val + x%val*(2.0_dp*q20 + q19)
    2829        63716 :       q22 = q21 + pow2(q6)
    2830        63716 :       q23 = pow(x%val, -3.0_dp + y%val)
    2831        63716 :       q24 = 2.0_dp*y%val
    2832        63716 :       q25 = q2*pow3(x%val)
    2833        63716 :       q26 = 3.0_dp*x%d1val1
    2834        63716 :       q27 = 2.0_dp*y%d1val1_d1val2
    2835        63716 :       q28 = 2.0_dp*x%d1val1_d1val2
    2836        63716 :       q29 = 2.0_dp*q17
    2837        63716 :       q30 = 3.0_dp*x%d1val2
    2838        63716 :       binary%val = pow(x%val, y%val)
    2839        63716 :       binary%d1val1 = q0*q4
    2840        63716 :       binary%d1val2 = q0*q6
    2841        63716 :       binary%d2val1 = q14*q7
    2842        63716 :       binary%d1val1_d1val2 = (q17 + q4*q6)*pow(x%val, 3.0_dp + y%val)*powm1(pow5(x%val))
    2843        63716 :       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        63716 :                       + 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        63716 :                               * 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        63716 :                              - 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        63716 :                        + q9*(3.0_dp*x%d2val2*y%d1val2 + q30*y%d2val2 + x%d3val2*y%val) + pow3(q6))
    2858        63716 :    end function pow_self
    2859              : 
    2860      1152312 :    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              :       real(dp) :: q21
    2865              :       real(dp) :: q20
    2866              :       real(dp) :: q19
    2867              :       real(dp) :: q18
    2868              :       real(dp) :: q17
    2869              :       real(dp) :: q16
    2870              :       real(dp) :: q15
    2871              :       real(dp) :: q14
    2872              :       real(dp) :: q13
    2873              :       real(dp) :: q12
    2874              :       real(dp) :: q11
    2875              :       real(dp) :: q10
    2876              :       real(dp) :: q9
    2877              :       real(dp) :: q8
    2878              :       real(dp) :: q7
    2879              :       real(dp) :: q6
    2880              :       real(dp) :: q5
    2881              :       real(dp) :: q4
    2882              :       real(dp) :: q3
    2883              :       real(dp) :: q2
    2884              :       real(dp) :: q1
    2885              :       real(dp) :: q0
    2886      1152312 :       q0 = y - 1
    2887      1152312 :       q1 = y*pow(x%val, q0)
    2888      1152312 :       q2 = x%d2val1*x%val
    2889      1152312 :       q3 = pow2(x%d1val1)
    2890      1152312 :       q4 = q3*y
    2891      1152312 :       q5 = pow(x%val, -2.0_dp + y)
    2892      1152312 :       q6 = q5*y
    2893      1152312 :       q7 = x%d1val1_d1val2*x%val
    2894      1152312 :       q8 = x%d1val1*x%d1val2
    2895      1152312 :       q9 = x%d2val2*x%val
    2896      1152312 :       q10 = pow2(x%d1val2)
    2897      1152312 :       q11 = q10*y
    2898      1152312 :       q12 = y*(-q10 + q11 + q9)
    2899      1152312 :       q13 = pow2(x%val)
    2900      1152312 :       q14 = pow2(y)
    2901      1152312 :       q15 = -3.0_dp*y + 2.0_dp + q14
    2902      1152312 :       q16 = y*pow(x%val, -3.0_dp + y)
    2903      1152312 :       q17 = 2.0_dp*q7
    2904      1152312 :       q18 = q17*x%d1val1
    2905      1152312 :       q19 = q2*x%d1val2
    2906      1152312 :       q20 = q3*x%d1val2
    2907      1152312 :       q21 = 3.0_dp*x%d1val2
    2908      1152312 :       unary%val = pow(x%val, y)
    2909      1152312 :       unary%d1val1 = q1*x%d1val1
    2910      1152312 :       unary%d1val2 = q1*x%d1val2
    2911      1152312 :       unary%d2val1 = q6*(q2 - q3 + q4)
    2912      1152312 :       unary%d1val1_d1val2 = q6*(q7 + q8*y - q8)
    2913      1152312 :       unary%d2val2 = q12*q5
    2914      1152312 :       unary%d3val1 = q16*(3.0_dp*q0*q2*x%d1val1 + q13*x%d3val1 + q15*pow3(x%d1val1))
    2915      1152312 :       unary%d2val1_d1val2 = q16*(2.0_dp*q20 + q13*x%d2val1_d1val2 + q14*q20 + q18*y - q18 + q19*y - q19 - q21*q4)
    2916      1152312 :       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      1152312 :       unary%d3val2 = q16*(q0*q21*q9 + q13*x%d3val2 + q15*pow3(x%d1val2))
    2918      1152312 :    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              :       real(dp) :: q8
    2925              :       real(dp) :: q7
    2926              :       real(dp) :: q6
    2927              :       real(dp) :: q5
    2928              :       real(dp) :: q4
    2929              :       real(dp) :: q3
    2930              :       real(dp) :: q2
    2931              :       real(dp) :: q1
    2932              :       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              :       real(dp) :: q21
    2960              :       real(dp) :: q20
    2961              :       real(dp) :: q19
    2962              :       real(dp) :: q18
    2963              :       real(dp) :: q17
    2964              :       real(dp) :: q16
    2965              :       real(dp) :: q15
    2966              :       real(dp) :: q14
    2967              :       real(dp) :: q13
    2968              :       real(dp) :: q12
    2969              :       real(dp) :: q11
    2970              :       real(dp) :: q10
    2971              :       real(dp) :: q9
    2972              :       real(dp) :: q8
    2973              :       real(dp) :: q7
    2974              :       real(dp) :: q6
    2975              :       real(dp) :: q5
    2976              :       real(dp) :: q4
    2977              :       real(dp) :: q3
    2978              :       real(dp) :: q2
    2979              :       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              :       real(dp) :: q8
    3022              :       real(dp) :: q7
    3023              :       real(dp) :: q6
    3024              :       real(dp) :: q5
    3025              :       real(dp) :: q4
    3026              :       real(dp) :: q3
    3027              :       real(dp) :: q2
    3028              :       real(dp) :: q1
    3029              :       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              :       real(dp) :: q1
    3057              :       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              :       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       454594 :    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              :       real(dp) :: q0
    3095       454594 :       q0 = Heaviside(x%val - z)
    3096       454594 :       unary%val = Max(x%val, z)
    3097       454594 :       unary%d1val1 = q0*x%d1val1
    3098       454594 :       unary%d1val2 = q0*x%d1val2
    3099       454594 :       unary%d2val1 = q0*x%d2val1
    3100       454594 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    3101       454594 :       unary%d2val2 = q0*x%d2val2
    3102       454594 :       unary%d3val1 = q0*x%d3val1
    3103       454594 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    3104       454594 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    3105       454594 :       unary%d3val2 = q0*x%d3val2
    3106       454594 :    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              :       real(dp) :: y_dp
    3113              :       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              :       real(dp) :: y_dp
    3133              :       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        32062 :    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              :       real(dp) :: q1
    3153              :       real(dp) :: q0
    3154        32062 :       q0 = Heaviside(-x%val + y%val)
    3155        32062 :       q1 = Heaviside(x%val - y%val)
    3156        32062 :       binary%val = Min(x%val, y%val)
    3157        32062 :       binary%d1val1 = q0*x%d1val1 + q1*y%d1val1
    3158        32062 :       binary%d1val2 = q0*x%d1val2 + q1*y%d1val2
    3159        32062 :       binary%d2val1 = q0*x%d2val1 + q1*y%d2val1
    3160        32062 :       binary%d1val1_d1val2 = q0*x%d1val1_d1val2 + q1*y%d1val1_d1val2
    3161        32062 :       binary%d2val2 = q0*x%d2val2 + q1*y%d2val2
    3162        32062 :       binary%d3val1 = q0*x%d3val1 + q1*y%d3val1
    3163        32062 :       binary%d2val1_d1val2 = q0*x%d2val1_d1val2 + q1*y%d2val1_d1val2
    3164        32062 :       binary%d1val1_d2val2 = q0*x%d1val1_d2val2 + q1*y%d1val1_d2val2
    3165        32062 :       binary%d3val2 = q0*x%d3val2 + q1*y%d3val2
    3166        32062 :    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              :       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       422532 :    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              :       real(dp) :: q0
    3191       422532 :       q0 = Heaviside(-x%val + z)
    3192       422532 :       unary%val = Min(x%val, z)
    3193       422532 :       unary%d1val1 = q0*x%d1val1
    3194       422532 :       unary%d1val2 = q0*x%d1val2
    3195       422532 :       unary%d2val1 = q0*x%d2val1
    3196       422532 :       unary%d1val1_d1val2 = q0*x%d1val1_d1val2
    3197       422532 :       unary%d2val2 = q0*x%d2val2
    3198       422532 :       unary%d3val1 = q0*x%d3val1
    3199       422532 :       unary%d2val1_d1val2 = q0*x%d2val1_d1val2
    3200       422532 :       unary%d1val1_d2val2 = q0*x%d1val1_d2val2
    3201       422532 :       unary%d3val2 = q0*x%d3val2
    3202       422532 :    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              :       real(dp) :: y_dp
    3209              :       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              :       real(dp) :: y_dp
    3229              :       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              :       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              :       real(dp) :: q5
    3269              :       real(dp) :: q4
    3270              :       real(dp) :: q3
    3271              :       real(dp) :: q2
    3272              :       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              :       real(dp) :: q5
    3297              :       real(dp) :: q4
    3298              :       real(dp) :: q3
    3299              :       real(dp) :: q2
    3300              :       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              :       real(dp) :: y_dp
    3325              :       real(dp) :: q5
    3326              :       real(dp) :: q4
    3327              :       real(dp) :: q3
    3328              :       real(dp) :: q2
    3329              :       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              :       real(dp) :: y_dp
    3355              :       real(dp) :: q5
    3356              :       real(dp) :: q4
    3357              :       real(dp) :: q3
    3358              :       real(dp) :: q2
    3359              :       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       371576 :    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       371576 :       derivative%val = this%d1val1
    3384       371576 :       derivative%d1val1 = this%d2val1
    3385       371576 :       derivative%d1val2 = this%d1val1_d1val2
    3386       371576 :       derivative%d2val1 = this%d3val1
    3387       371576 :       derivative%d1val1_d1val2 = this%d2val1_d1val2
    3388       371576 :       derivative%d2val2 = this%d1val1_d2val2
    3389       371576 :       derivative%d3val1 = 0.0_dp
    3390       371576 :       derivative%d2val1_d1val2 = 0.0_dp
    3391       371576 :       derivative%d1val1_d2val2 = 0.0_dp
    3392       371576 :       derivative%d3val2 = 0.0_dp
    3393       371576 :    end function differentiate_auto_diff_real_2var_order3_1
    3394              : 
    3395        96186 :    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        96186 :       derivative%val = this%d1val2
    3399        96186 :       derivative%d1val1 = this%d1val1_d1val2
    3400        96186 :       derivative%d1val2 = this%d2val2
    3401        96186 :       derivative%d2val1 = this%d2val1_d1val2
    3402        96186 :       derivative%d1val1_d1val2 = this%d1val1_d2val2
    3403        96186 :       derivative%d2val2 = this%d3val2
    3404        96186 :       derivative%d3val1 = 0.0_dp
    3405        96186 :       derivative%d2val1_d1val2 = 0.0_dp
    3406        96186 :       derivative%d1val1_d2val2 = 0.0_dp
    3407        96186 :       derivative%d3val2 = 0.0_dp
    3408        96186 :    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