LCOV - code coverage report
Current view: top level - auto_diff/private - auto_diff_real_tdc_module.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 16.9 % 874 148
Test Date: 2025-05-08 18:23:42 Functions: 20.5 % 117 24

            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_tdc_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_tdc, &
      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              :    type :: auto_diff_real_tdc
      87              :       real(dp) :: val
      88              :       real(dp) :: d1val1
      89              :       real(dp) :: d1Array(33)
      90              :       real(dp) :: d1val1_d1Array(33)
      91              :    end type auto_diff_real_tdc
      92              : 
      93              :    interface assignment(=)
      94              :       module procedure assign_from_self
      95              :       module procedure assign_from_real_dp
      96              :       module procedure assign_from_int
      97              :    end interface assignment(=)
      98              : 
      99              :    interface operator(.eq.)
     100              :       module procedure equal_self
     101              :       module procedure equal_auto_diff_real_tdc_real_dp
     102              :       module procedure equal_real_dp_auto_diff_real_tdc
     103              :       module procedure equal_auto_diff_real_tdc_int
     104              :       module procedure equal_int_auto_diff_real_tdc
     105              :    end interface operator(.eq.)
     106              : 
     107              :    interface operator(.ne.)
     108              :       module procedure neq_self
     109              :       module procedure neq_auto_diff_real_tdc_real_dp
     110              :       module procedure neq_real_dp_auto_diff_real_tdc
     111              :       module procedure neq_auto_diff_real_tdc_int
     112              :       module procedure neq_int_auto_diff_real_tdc
     113              :    end interface operator(.ne.)
     114              : 
     115              :    interface operator(.gt.)
     116              :       module procedure greater_self
     117              :       module procedure greater_auto_diff_real_tdc_real_dp
     118              :       module procedure greater_real_dp_auto_diff_real_tdc
     119              :       module procedure greater_auto_diff_real_tdc_int
     120              :       module procedure greater_int_auto_diff_real_tdc
     121              :    end interface operator(.gt.)
     122              : 
     123              :    interface operator(.lt.)
     124              :       module procedure less_self
     125              :       module procedure less_auto_diff_real_tdc_real_dp
     126              :       module procedure less_real_dp_auto_diff_real_tdc
     127              :       module procedure less_auto_diff_real_tdc_int
     128              :       module procedure less_int_auto_diff_real_tdc
     129              :    end interface operator(.lt.)
     130              : 
     131              :    interface operator(.le.)
     132              :       module procedure leq_self
     133              :       module procedure leq_auto_diff_real_tdc_real_dp
     134              :       module procedure leq_real_dp_auto_diff_real_tdc
     135              :       module procedure leq_auto_diff_real_tdc_int
     136              :       module procedure leq_int_auto_diff_real_tdc
     137              :    end interface operator(.le.)
     138              : 
     139              :    interface operator(.ge.)
     140              :       module procedure geq_self
     141              :       module procedure geq_auto_diff_real_tdc_real_dp
     142              :       module procedure geq_real_dp_auto_diff_real_tdc
     143              :       module procedure geq_auto_diff_real_tdc_int
     144              :       module procedure geq_int_auto_diff_real_tdc
     145              :    end interface operator(.ge.)
     146              : 
     147              :    interface make_unop
     148              :       module procedure make_unary_operator
     149              :    end interface make_unop
     150              : 
     151              :    interface make_binop
     152              :       module procedure make_binary_operator
     153              :    end interface make_binop
     154              : 
     155              :    interface sign
     156              :       module procedure sign_self
     157              :    end interface sign
     158              : 
     159              :    interface safe_sqrt
     160              :       module procedure safe_sqrt_self
     161              :    end interface safe_sqrt
     162              : 
     163              :    interface operator(-)
     164              :       module procedure unary_minus_self
     165              :    end interface operator(-)
     166              : 
     167              :    interface exp
     168              :       module procedure exp_self
     169              :    end interface exp
     170              : 
     171              :    interface expm1
     172              :       module procedure expm1_self
     173              :    end interface expm1
     174              : 
     175              :    interface exp10
     176              :       module procedure exp10_self
     177              :    end interface exp10
     178              : 
     179              :    interface powm1
     180              :       module procedure powm1_self
     181              :    end interface powm1
     182              : 
     183              :    interface log
     184              :       module procedure log_self
     185              :    end interface log
     186              : 
     187              :    interface log1p
     188              :       module procedure log1p_self
     189              :    end interface log1p
     190              : 
     191              :    interface safe_log
     192              :       module procedure safe_log_self
     193              :    end interface safe_log
     194              : 
     195              :    interface log10
     196              :       module procedure log10_self
     197              :    end interface log10
     198              : 
     199              :    interface safe_log10
     200              :       module procedure safe_log10_self
     201              :    end interface safe_log10
     202              : 
     203              :    interface log2
     204              :       module procedure log2_self
     205              :    end interface log2
     206              : 
     207              :    interface sin
     208              :       module procedure sin_self
     209              :    end interface sin
     210              : 
     211              :    interface cos
     212              :       module procedure cos_self
     213              :    end interface cos
     214              : 
     215              :    interface tan
     216              :       module procedure tan_self
     217              :    end interface tan
     218              : 
     219              :    interface sinpi
     220              :       module procedure sinpi_self
     221              :    end interface sinpi
     222              : 
     223              :    interface cospi
     224              :       module procedure cospi_self
     225              :    end interface cospi
     226              : 
     227              :    interface tanpi
     228              :       module procedure tanpi_self
     229              :    end interface tanpi
     230              : 
     231              :    interface sinh
     232              :       module procedure sinh_self
     233              :    end interface sinh
     234              : 
     235              :    interface cosh
     236              :       module procedure cosh_self
     237              :    end interface cosh
     238              : 
     239              :    interface tanh
     240              :       module procedure tanh_self
     241              :    end interface tanh
     242              : 
     243              :    interface asin
     244              :       module procedure asin_self
     245              :    end interface asin
     246              : 
     247              :    interface acos
     248              :       module procedure acos_self
     249              :    end interface acos
     250              : 
     251              :    interface atan
     252              :       module procedure atan_self
     253              :    end interface atan
     254              : 
     255              :    interface asinpi
     256              :       module procedure asinpi_self
     257              :    end interface asinpi
     258              : 
     259              :    interface acospi
     260              :       module procedure acospi_self
     261              :    end interface acospi
     262              : 
     263              :    interface atanpi
     264              :       module procedure atanpi_self
     265              :    end interface atanpi
     266              : 
     267              :    interface asinh
     268              :       module procedure asinh_self
     269              :    end interface asinh
     270              : 
     271              :    interface acosh
     272              :       module procedure acosh_self
     273              :    end interface acosh
     274              : 
     275              :    interface atanh
     276              :       module procedure atanh_self
     277              :    end interface atanh
     278              : 
     279              :    interface sqrt
     280              :       module procedure sqrt_self
     281              :    end interface sqrt
     282              : 
     283              :    interface pow2
     284              :       module procedure pow2_self
     285              :    end interface pow2
     286              : 
     287              :    interface pow3
     288              :       module procedure pow3_self
     289              :    end interface pow3
     290              : 
     291              :    interface pow4
     292              :       module procedure pow4_self
     293              :    end interface pow4
     294              : 
     295              :    interface pow5
     296              :       module procedure pow5_self
     297              :    end interface pow5
     298              : 
     299              :    interface pow6
     300              :       module procedure pow6_self
     301              :    end interface pow6
     302              : 
     303              :    interface pow7
     304              :       module procedure pow7_self
     305              :    end interface pow7
     306              : 
     307              :    interface pow8
     308              :       module procedure pow8_self
     309              :    end interface pow8
     310              : 
     311              :    interface abs
     312              :       module procedure abs_self
     313              :    end interface abs
     314              : 
     315              :    interface operator(+)
     316              :       module procedure add_self
     317              :       module procedure add_self_real
     318              :       module procedure add_real_self
     319              :       module procedure add_self_int
     320              :       module procedure add_int_self
     321              :    end interface operator(+)
     322              : 
     323              :    interface operator(-)
     324              :       module procedure sub_self
     325              :       module procedure sub_self_real
     326              :       module procedure sub_real_self
     327              :       module procedure sub_self_int
     328              :       module procedure sub_int_self
     329              :    end interface operator(-)
     330              : 
     331              :    interface operator(*)
     332              :       module procedure mul_self
     333              :       module procedure mul_self_real
     334              :       module procedure mul_real_self
     335              :       module procedure mul_self_int
     336              :       module procedure mul_int_self
     337              :    end interface operator(*)
     338              : 
     339              :    interface operator(/)
     340              :       module procedure div_self
     341              :       module procedure div_self_real
     342              :       module procedure div_real_self
     343              :       module procedure div_self_int
     344              :       module procedure div_int_self
     345              :    end interface operator(/)
     346              : 
     347              :    interface pow
     348              :       module procedure pow_self
     349              :       module procedure pow_self_real
     350              :       module procedure pow_real_self
     351              :       module procedure pow_self_int
     352              :       module procedure pow_int_self
     353              :    end interface pow
     354              : 
     355              :    interface max
     356              :       module procedure max_self
     357              :       module procedure max_self_real
     358              :       module procedure max_real_self
     359              :       module procedure max_self_int
     360              :       module procedure max_int_self
     361              :    end interface max
     362              : 
     363              :    interface min
     364              :       module procedure min_self
     365              :       module procedure min_self_real
     366              :       module procedure min_real_self
     367              :       module procedure min_self_int
     368              :       module procedure min_int_self
     369              :    end interface min
     370              : 
     371              :    interface dim
     372              :       module procedure dim_self
     373              :       module procedure dim_self_real
     374              :       module procedure dim_real_self
     375              :       module procedure dim_self_int
     376              :       module procedure dim_int_self
     377              :    end interface dim
     378              : 
     379              :    interface differentiate_1
     380              :       module procedure differentiate_auto_diff_real_tdc_1
     381              :    end interface differentiate_1
     382              : 
     383              :    contains
     384              : 
     385      6024950 :    subroutine assign_from_self(this, other)
     386              :       type(auto_diff_real_tdc), intent(out) :: this
     387              :       type(auto_diff_real_tdc), intent(in) :: other
     388      6024950 :       this%val = other%val
     389      6024950 :       this%d1val1 = other%d1val1
     390    204848300 :       this%d1Array = other%d1Array
     391    204848300 :       this%d1val1_d1Array = other%d1val1_d1Array
     392      6024950 :    end subroutine assign_from_self
     393              : 
     394       651402 :    subroutine assign_from_real_dp(this, other)
     395              :       type(auto_diff_real_tdc), intent(out) :: this
     396              :       real(dp), intent(in) :: other
     397       651402 :       this%val = other
     398       651402 :       this%d1val1 = 0.0_dp
     399     22147668 :       this%d1Array = 0.0_dp
     400     22147668 :       this%d1val1_d1Array = 0.0_dp
     401       651402 :    end subroutine assign_from_real_dp
     402              : 
     403            0 :    subroutine assign_from_int(this, other)
     404              :       type(auto_diff_real_tdc), intent(out) :: this
     405              :       integer, intent(in) :: other
     406            0 :       this%val = other
     407            0 :       this%d1val1 = 0.0_dp
     408            0 :       this%d1Array = 0.0_dp
     409            0 :       this%d1val1_d1Array = 0.0_dp
     410            0 :    end subroutine assign_from_int
     411              : 
     412            0 :    function equal_self(this, other) result(z)
     413              :       type(auto_diff_real_tdc), intent(in) :: this
     414              :       type(auto_diff_real_tdc), intent(in) :: other
     415              :       logical :: z
     416            0 :       z = (this%val == other%val)
     417            0 :    end function equal_self
     418              : 
     419            0 :    function equal_auto_diff_real_tdc_real_dp(this, other) result(z)
     420              :       type(auto_diff_real_tdc), intent(in) :: this
     421              :       real(dp), intent(in) :: other
     422              :       logical :: z
     423            0 :       z = (this%val == other)
     424            0 :    end function equal_auto_diff_real_tdc_real_dp
     425              : 
     426            0 :    function equal_real_dp_auto_diff_real_tdc(this, other) result(z)
     427              :       real(dp), intent(in) :: this
     428              :       type(auto_diff_real_tdc), intent(in) :: other
     429              :       logical :: z
     430            0 :       z = (this == other%val)
     431            0 :    end function equal_real_dp_auto_diff_real_tdc
     432              : 
     433          136 :    function equal_auto_diff_real_tdc_int(this, other) result(z)
     434              :       type(auto_diff_real_tdc), intent(in) :: this
     435              :       integer, intent(in) :: other
     436              :       logical :: z
     437          136 :       z = (this%val == other)
     438          136 :    end function equal_auto_diff_real_tdc_int
     439              : 
     440            0 :    function equal_int_auto_diff_real_tdc(this, other) result(z)
     441              :       integer, intent(in) :: this
     442              :       type(auto_diff_real_tdc), intent(in) :: other
     443              :       logical :: z
     444            0 :       z = (this == other%val)
     445            0 :    end function equal_int_auto_diff_real_tdc
     446              : 
     447            0 :    function neq_self(this, other) result(z)
     448              :       type(auto_diff_real_tdc), intent(in) :: this
     449              :       type(auto_diff_real_tdc), intent(in) :: other
     450              :       logical :: z
     451            0 :       z = (this%val /= other%val)
     452            0 :    end function neq_self
     453              : 
     454            0 :    function neq_auto_diff_real_tdc_real_dp(this, other) result(z)
     455              :       type(auto_diff_real_tdc), intent(in) :: this
     456              :       real(dp), intent(in) :: other
     457              :       logical :: z
     458            0 :       z = (this%val /= other)
     459            0 :    end function neq_auto_diff_real_tdc_real_dp
     460              : 
     461            0 :    function neq_real_dp_auto_diff_real_tdc(this, other) result(z)
     462              :       real(dp), intent(in) :: this
     463              :       type(auto_diff_real_tdc), intent(in) :: other
     464              :       logical :: z
     465            0 :       z = (this /= other%val)
     466            0 :    end function neq_real_dp_auto_diff_real_tdc
     467              : 
     468            0 :    function neq_auto_diff_real_tdc_int(this, other) result(z)
     469              :       type(auto_diff_real_tdc), intent(in) :: this
     470              :       integer, intent(in) :: other
     471              :       logical :: z
     472            0 :       z = (this%val /= other)
     473            0 :    end function neq_auto_diff_real_tdc_int
     474              : 
     475            0 :    function neq_int_auto_diff_real_tdc(this, other) result(z)
     476              :       integer, intent(in) :: this
     477              :       type(auto_diff_real_tdc), intent(in) :: other
     478              :       logical :: z
     479            0 :       z = (this /= other%val)
     480            0 :    end function neq_int_auto_diff_real_tdc
     481              : 
     482        32130 :    function greater_self(this, other) result(z)
     483              :       type(auto_diff_real_tdc), intent(in) :: this
     484              :       type(auto_diff_real_tdc), intent(in) :: other
     485              :       logical :: z
     486        32130 :       z = (this%val > other%val)
     487        32130 :    end function greater_self
     488              : 
     489      1080191 :    function greater_auto_diff_real_tdc_real_dp(this, other) result(z)
     490              :       type(auto_diff_real_tdc), intent(in) :: this
     491              :       real(dp), intent(in) :: other
     492              :       logical :: z
     493      1080191 :       z = (this%val > other)
     494      1080191 :    end function greater_auto_diff_real_tdc_real_dp
     495              : 
     496            0 :    function greater_real_dp_auto_diff_real_tdc(this, other) result(z)
     497              :       real(dp), intent(in) :: this
     498              :       type(auto_diff_real_tdc), intent(in) :: other
     499              :       logical :: z
     500            0 :       z = (this > other%val)
     501            0 :    end function greater_real_dp_auto_diff_real_tdc
     502              : 
     503       304494 :    function greater_auto_diff_real_tdc_int(this, other) result(z)
     504              :       type(auto_diff_real_tdc), intent(in) :: this
     505              :       integer, intent(in) :: other
     506              :       logical :: z
     507       304494 :       z = (this%val > other)
     508       304494 :    end function greater_auto_diff_real_tdc_int
     509              : 
     510            0 :    function greater_int_auto_diff_real_tdc(this, other) result(z)
     511              :       integer, intent(in) :: this
     512              :       type(auto_diff_real_tdc), intent(in) :: other
     513              :       logical :: z
     514            0 :       z = (this > other%val)
     515            0 :    end function greater_int_auto_diff_real_tdc
     516              : 
     517       121551 :    function less_self(this, other) result(z)
     518              :       type(auto_diff_real_tdc), intent(in) :: this
     519              :       type(auto_diff_real_tdc), intent(in) :: other
     520              :       logical :: z
     521       121551 :       z = (this%val < other%val)
     522       121551 :    end function less_self
     523              : 
     524       746704 :    function less_auto_diff_real_tdc_real_dp(this, other) result(z)
     525              :       type(auto_diff_real_tdc), intent(in) :: this
     526              :       real(dp), intent(in) :: other
     527              :       logical :: z
     528       746704 :       z = (this%val < other)
     529       746704 :    end function less_auto_diff_real_tdc_real_dp
     530              : 
     531            0 :    function less_real_dp_auto_diff_real_tdc(this, other) result(z)
     532              :       real(dp), intent(in) :: this
     533              :       type(auto_diff_real_tdc), intent(in) :: other
     534              :       logical :: z
     535            0 :       z = (this < other%val)
     536            0 :    end function less_real_dp_auto_diff_real_tdc
     537              : 
     538           34 :    function less_auto_diff_real_tdc_int(this, other) result(z)
     539              :       type(auto_diff_real_tdc), intent(in) :: this
     540              :       integer, intent(in) :: other
     541              :       logical :: z
     542           34 :       z = (this%val < other)
     543           34 :    end function less_auto_diff_real_tdc_int
     544              : 
     545            0 :    function less_int_auto_diff_real_tdc(this, other) result(z)
     546              :       integer, intent(in) :: this
     547              :       type(auto_diff_real_tdc), intent(in) :: other
     548              :       logical :: z
     549            0 :       z = (this < other%val)
     550            0 :    end function less_int_auto_diff_real_tdc
     551              : 
     552            0 :    function leq_self(this, other) result(z)
     553              :       type(auto_diff_real_tdc), intent(in) :: this
     554              :       type(auto_diff_real_tdc), intent(in) :: other
     555              :       logical :: z
     556            0 :       z = (this%val <= other%val)
     557            0 :    end function leq_self
     558              : 
     559            0 :    function leq_auto_diff_real_tdc_real_dp(this, other) result(z)
     560              :       type(auto_diff_real_tdc), intent(in) :: this
     561              :       real(dp), intent(in) :: other
     562              :       logical :: z
     563            0 :       z = (this%val <= other)
     564            0 :    end function leq_auto_diff_real_tdc_real_dp
     565              : 
     566            0 :    function leq_real_dp_auto_diff_real_tdc(this, other) result(z)
     567              :       real(dp), intent(in) :: this
     568              :       type(auto_diff_real_tdc), intent(in) :: other
     569              :       logical :: z
     570            0 :       z = (this <= other%val)
     571            0 :    end function leq_real_dp_auto_diff_real_tdc
     572              : 
     573            0 :    function leq_auto_diff_real_tdc_int(this, other) result(z)
     574              :       type(auto_diff_real_tdc), intent(in) :: this
     575              :       integer, intent(in) :: other
     576              :       logical :: z
     577            0 :       z = (this%val <= other)
     578            0 :    end function leq_auto_diff_real_tdc_int
     579              : 
     580            0 :    function leq_int_auto_diff_real_tdc(this, other) result(z)
     581              :       integer, intent(in) :: this
     582              :       type(auto_diff_real_tdc), intent(in) :: other
     583              :       logical :: z
     584            0 :       z = (this <= other%val)
     585            0 :    end function leq_int_auto_diff_real_tdc
     586              : 
     587            0 :    function geq_self(this, other) result(z)
     588              :       type(auto_diff_real_tdc), intent(in) :: this
     589              :       type(auto_diff_real_tdc), intent(in) :: other
     590              :       logical :: z
     591            0 :       z = (this%val >= other%val)
     592            0 :    end function geq_self
     593              : 
     594            0 :    function geq_auto_diff_real_tdc_real_dp(this, other) result(z)
     595              :       type(auto_diff_real_tdc), intent(in) :: this
     596              :       real(dp), intent(in) :: other
     597              :       logical :: z
     598            0 :       z = (this%val >= other)
     599            0 :    end function geq_auto_diff_real_tdc_real_dp
     600              : 
     601            0 :    function geq_real_dp_auto_diff_real_tdc(this, other) result(z)
     602              :       real(dp), intent(in) :: this
     603              :       type(auto_diff_real_tdc), intent(in) :: other
     604              :       logical :: z
     605            0 :       z = (this >= other%val)
     606            0 :    end function geq_real_dp_auto_diff_real_tdc
     607              : 
     608            0 :    function geq_auto_diff_real_tdc_int(this, other) result(z)
     609              :       type(auto_diff_real_tdc), intent(in) :: this
     610              :       integer, intent(in) :: other
     611              :       logical :: z
     612            0 :       z = (this%val >= other)
     613            0 :    end function geq_auto_diff_real_tdc_int
     614              : 
     615            0 :    function geq_int_auto_diff_real_tdc(this, other) result(z)
     616              :       integer, intent(in) :: this
     617              :       type(auto_diff_real_tdc), intent(in) :: other
     618              :       logical :: z
     619            0 :       z = (this >= other%val)
     620            0 :    end function geq_int_auto_diff_real_tdc
     621              : 
     622            0 :    function make_unary_operator(x, z_val, z_d1x, z_d2x) result(unary)
     623              :       type(auto_diff_real_tdc), intent(in) :: x
     624              :       real(dp), intent(in) :: z_val
     625              :       real(dp), intent(in) :: z_d1x
     626              :       real(dp), intent(in) :: z_d2x
     627              :       type(auto_diff_real_tdc) :: unary
     628            0 :       unary%val = z_val
     629            0 :       unary%d1val1 = x%d1val1*z_d1x
     630            0 :       unary%d1Array(1:33) = x%d1Array(1:33)*z_d1x
     631            0 :       unary%d1val1_d1Array(1:33) = x%d1Array(1:33)*x%d1val1*z_d2x + x%d1val1_d1Array(1:33)*z_d1x
     632            0 :    end function make_unary_operator
     633              : 
     634            0 :    function make_binary_operator(x, y, z_val, z_d1x, z_d1y, z_d2x, z_d1x_d1y, z_d2y) result(binary)
     635              :       type(auto_diff_real_tdc), intent(in) :: x
     636              :       type(auto_diff_real_tdc), intent(in) :: y
     637              :       real(dp), intent(in) :: z_val
     638              :       real(dp), intent(in) :: z_d1x
     639              :       real(dp), intent(in) :: z_d1y
     640              :       real(dp), intent(in) :: z_d2x
     641              :       real(dp), intent(in) :: z_d1x_d1y
     642              :       real(dp), intent(in) :: z_d2y
     643              :       type(auto_diff_real_tdc) :: binary
     644            0 :       binary%val = z_val
     645            0 :       binary%d1val1 = x%d1val1*z_d1x + y%d1val1*z_d1y
     646            0 :       binary%d1Array(1:33) = x%d1Array(1:33)*z_d1x + y%d1Array(1:33)*z_d1y
     647              :       binary%d1val1_d1Array(1:33) = x%d1Array(1:33)*x%d1val1*z_d2x + x%d1Array(1:33)*y%d1val1*z_d1x_d1y &
     648              :                                     + x%d1val1*y%d1Array(1:33)*z_d1x_d1y + x%d1val1_d1Array(1:33)*z_d1x &
     649            0 :                                     + y%d1Array(1:33)*y%d1val1*z_d2y + y%d1val1_d1Array(1:33)*z_d1y
     650            0 :    end function make_binary_operator
     651              : 
     652            0 :    function sign_self(x) result(unary)
     653              :       type(auto_diff_real_tdc), intent(in) :: x
     654              :       type(auto_diff_real_tdc) :: unary
     655            0 :       unary%val = sgn(x%val)
     656            0 :       unary%d1val1 = 0.0_dp
     657            0 :       unary%d1Array(1:33) = 0.0_dp
     658            0 :       unary%d1val1_d1Array(1:33) = 0.0_dp
     659            0 :    end function sign_self
     660              : 
     661            0 :    function safe_sqrt_self(x) result(unary)
     662              :       type(auto_diff_real_tdc), intent(in) :: x
     663              :       type(auto_diff_real_tdc) :: unary
     664            0 :       real(dp) :: q1
     665            0 :       real(dp) :: q0
     666            0 :       q0 = sqrt(x%val*Heaviside(x%val))
     667            0 :       q1 = 0.5_dp*q0*powm1(x%val)
     668            0 :       unary%val = q0
     669            0 :       unary%d1val1 = q1*x%d1val1
     670            0 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
     671            0 :       unary%d1val1_d1Array(1:33) = 0.25_dp*q0*(2.0_dp*x%d1val1_d1Array(1:33)*x%val - x%d1Array(1:33)*x%d1val1)*powm1(pow2(x%val))
     672            0 :    end function safe_sqrt_self
     673              : 
     674       825447 :    function unary_minus_self(x) result(unary)
     675              :       type(auto_diff_real_tdc), intent(in) :: x
     676              :       type(auto_diff_real_tdc) :: unary
     677       825447 :       unary%val = -x%val
     678       825447 :       unary%d1val1 = -x%d1val1
     679     28065198 :       unary%d1Array(1:33) = -x%d1Array(1:33)
     680     28065198 :       unary%d1val1_d1Array(1:33) = -x%d1val1_d1Array(1:33)
     681       825447 :    end function unary_minus_self
     682              : 
     683       197007 :    function exp_self(x) result(unary)
     684              :       type(auto_diff_real_tdc), intent(in) :: x
     685              :       type(auto_diff_real_tdc) :: unary
     686       197007 :       real(dp) :: q0
     687       197007 :       q0 = exp(x%val)
     688       197007 :       unary%val = q0
     689       197007 :       unary%d1val1 = q0*x%d1val1
     690      6698238 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
     691      6698238 :       unary%d1val1_d1Array(1:33) = q0*(x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33))
     692       197007 :    end function exp_self
     693              : 
     694            0 :    function expm1_self(x) result(unary)
     695              :       type(auto_diff_real_tdc), intent(in) :: x
     696              :       type(auto_diff_real_tdc) :: unary
     697            0 :       real(dp) :: q0
     698            0 :       q0 = exp(x%val)
     699            0 :       unary%val = expm1(x%val)
     700            0 :       unary%d1val1 = q0*x%d1val1
     701            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
     702            0 :       unary%d1val1_d1Array(1:33) = q0*(x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33))
     703            0 :    end function expm1_self
     704              : 
     705            0 :    function exp10_self(x) result(unary)
     706              :       type(auto_diff_real_tdc), intent(in) :: x
     707              :       type(auto_diff_real_tdc) :: unary
     708            0 :       real(dp) :: q2
     709            0 :       real(dp) :: q1
     710            0 :       real(dp) :: q0
     711            0 :       q0 = pow(10.0_dp, x%val)
     712            0 :       q1 = ln10
     713            0 :       q2 = q0*q1
     714            0 :       unary%val = q0
     715            0 :       unary%d1val1 = q2*x%d1val1
     716            0 :       unary%d1Array(1:33) = q2*x%d1Array(1:33)
     717            0 :       unary%d1val1_d1Array(1:33) = q2*(q1*x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33))
     718            0 :    end function exp10_self
     719              : 
     720            0 :    function powm1_self(x) result(unary)
     721              :       type(auto_diff_real_tdc), intent(in) :: x
     722              :       type(auto_diff_real_tdc) :: unary
     723            0 :       real(dp) :: q0
     724            0 :       q0 = powm1(pow2(x%val))
     725            0 :       unary%val = powm1(x%val)
     726            0 :       unary%d1val1 = -q0*x%d1val1
     727            0 :       unary%d1Array(1:33) = -q0*x%d1Array(1:33)
     728            0 :       unary%d1val1_d1Array(1:33) = (2.0_dp*x%d1Array(1:33)*x%d1val1 - x%d1val1_d1Array(1:33)*x%val)*powm1(pow3(x%val))
     729            0 :    end function powm1_self
     730              : 
     731            0 :    function log_self(x) result(unary)
     732              :       type(auto_diff_real_tdc), intent(in) :: x
     733              :       type(auto_diff_real_tdc) :: unary
     734            0 :       real(dp) :: q0
     735            0 :       q0 = powm1(x%val)
     736            0 :       unary%val = log(x%val)
     737            0 :       unary%d1val1 = q0*x%d1val1
     738            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
     739            0 :       unary%d1val1_d1Array(1:33) = (-x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33)*x%val)*powm1(pow2(x%val))
     740            0 :    end function log_self
     741              : 
     742            0 :    function log1p_self(x) result(unary)
     743              :       type(auto_diff_real_tdc), intent(in) :: x
     744              :       type(auto_diff_real_tdc) :: unary
     745            0 :       real(dp) :: q1
     746              :       real(dp) :: q0
     747            0 :       q0 = x%val + 1
     748            0 :       q1 = powm1(q0)
     749            0 :       unary%val = log1p(x%val)
     750            0 :       unary%d1val1 = q1*x%d1val1
     751            0 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
     752            0 :       unary%d1val1_d1Array(1:33) = (q0*x%d1val1_d1Array(1:33) - x%d1Array(1:33)*x%d1val1)*powm1(pow2(q0))
     753            0 :    end function log1p_self
     754              : 
     755            0 :    function safe_log_self(x) result(unary)
     756              :       type(auto_diff_real_tdc), intent(in) :: x
     757              :       type(auto_diff_real_tdc) :: unary
     758            0 :       real(dp) :: q0
     759            0 :       q0 = powm1(x%val)
     760            0 :       unary%val = safe_log(x%val)
     761            0 :       unary%d1val1 = q0*x%d1val1
     762            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
     763            0 :       unary%d1val1_d1Array(1:33) = (-x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33)*x%val)*powm1(pow2(x%val))
     764            0 :    end function safe_log_self
     765              : 
     766            0 :    function log10_self(x) result(unary)
     767              :       type(auto_diff_real_tdc), intent(in) :: x
     768              :       type(auto_diff_real_tdc) :: unary
     769            0 :       real(dp) :: q1
     770            0 :       real(dp) :: q0
     771            0 :       q0 = powm1(ln10)
     772            0 :       q1 = q0*powm1(x%val)
     773            0 :       unary%val = q0*log(x%val)
     774            0 :       unary%d1val1 = q1*x%d1val1
     775            0 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
     776            0 :       unary%d1val1_d1Array(1:33) = q0*(-x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33)*x%val)*powm1(pow2(x%val))
     777            0 :    end function log10_self
     778              : 
     779            0 :    function safe_log10_self(x) result(unary)
     780              :       type(auto_diff_real_tdc), intent(in) :: x
     781              :       type(auto_diff_real_tdc) :: unary
     782            0 :       real(dp) :: q1
     783            0 :       real(dp) :: q0
     784            0 :       q0 = powm1(ln10)
     785            0 :       q1 = q0*powm1(x%val)
     786            0 :       unary%val = q0*safe_log(x%val)
     787            0 :       unary%d1val1 = q1*x%d1val1
     788            0 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
     789            0 :       unary%d1val1_d1Array(1:33) = q0*(-x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33)*x%val)*powm1(pow2(x%val))
     790            0 :    end function safe_log10_self
     791              : 
     792            0 :    function log2_self(x) result(unary)
     793              :       type(auto_diff_real_tdc), intent(in) :: x
     794              :       type(auto_diff_real_tdc) :: unary
     795            0 :       real(dp) :: q1
     796            0 :       real(dp) :: q0
     797            0 :       q0 = powm1(log(2.0_dp))
     798            0 :       q1 = q0*powm1(x%val)
     799            0 :       unary%val = q0*log(x%val)
     800            0 :       unary%d1val1 = q1*x%d1val1
     801            0 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
     802            0 :       unary%d1val1_d1Array(1:33) = q0*(-x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33)*x%val)*powm1(pow2(x%val))
     803            0 :    end function log2_self
     804              : 
     805            0 :    function sin_self(x) result(unary)
     806              :       type(auto_diff_real_tdc), intent(in) :: x
     807              :       type(auto_diff_real_tdc) :: unary
     808            0 :       real(dp) :: q1
     809            0 :       real(dp) :: q0
     810            0 :       q0 = sin(x%val)
     811            0 :       q1 = cos(x%val)
     812            0 :       unary%val = q0
     813            0 :       unary%d1val1 = q1*x%d1val1
     814            0 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
     815            0 :       unary%d1val1_d1Array(1:33) = -q0*x%d1Array(1:33)*x%d1val1 + q1*x%d1val1_d1Array(1:33)
     816            0 :    end function sin_self
     817              : 
     818            0 :    function cos_self(x) result(unary)
     819              :       type(auto_diff_real_tdc), intent(in) :: x
     820              :       type(auto_diff_real_tdc) :: unary
     821            0 :       real(dp) :: q1
     822            0 :       real(dp) :: q0
     823            0 :       q0 = cos(x%val)
     824            0 :       q1 = sin(x%val)
     825            0 :       unary%val = q0
     826            0 :       unary%d1val1 = -q1*x%d1val1
     827            0 :       unary%d1Array(1:33) = -q1*x%d1Array(1:33)
     828            0 :       unary%d1val1_d1Array(1:33) = -q0*x%d1Array(1:33)*x%d1val1 - q1*x%d1val1_d1Array(1:33)
     829            0 :    end function cos_self
     830              : 
     831         1576 :    function tan_self(x) result(unary)
     832              :       type(auto_diff_real_tdc), intent(in) :: x
     833              :       type(auto_diff_real_tdc) :: unary
     834         1576 :       real(dp) :: q1
     835              :       real(dp) :: q0
     836         1576 :       q0 = tan(x%val)
     837         1576 :       q1 = pow2(q0) + 1
     838         1576 :       unary%val = q0
     839         1576 :       unary%d1val1 = q1*x%d1val1
     840        53584 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
     841        53584 :       unary%d1val1_d1Array(1:33) = (2.0_dp*q0*x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33))*powm1(pow2(cos(x%val)))
     842         1576 :    end function tan_self
     843              : 
     844            0 :    function sinpi_self(x) result(unary)
     845              :       type(auto_diff_real_tdc), intent(in) :: x
     846              :       type(auto_diff_real_tdc) :: unary
     847            0 :       real(dp) :: q3
     848            0 :       real(dp) :: q2
     849            0 :       real(dp) :: q1
     850              :       real(dp) :: q0
     851            0 :       q0 = pi*x%val
     852            0 :       q1 = sin(q0)
     853            0 :       q2 = cos(q0)
     854            0 :       q3 = pi*q2
     855            0 :       unary%val = q1
     856            0 :       unary%d1val1 = q3*x%d1val1
     857            0 :       unary%d1Array(1:33) = q3*x%d1Array(1:33)
     858            0 :       unary%d1val1_d1Array(1:33) = pi*(-pi*q1*x%d1Array(1:33)*x%d1val1 + q2*x%d1val1_d1Array(1:33))
     859            0 :    end function sinpi_self
     860              : 
     861            0 :    function cospi_self(x) result(unary)
     862              :       type(auto_diff_real_tdc), intent(in) :: x
     863              :       type(auto_diff_real_tdc) :: unary
     864            0 :       real(dp) :: q3
     865            0 :       real(dp) :: q2
     866            0 :       real(dp) :: q1
     867              :       real(dp) :: q0
     868            0 :       q0 = pi*x%val
     869            0 :       q1 = cos(q0)
     870            0 :       q2 = sin(q0)
     871            0 :       q3 = pi*q2
     872            0 :       unary%val = q1
     873            0 :       unary%d1val1 = -q3*x%d1val1
     874            0 :       unary%d1Array(1:33) = -q3*x%d1Array(1:33)
     875            0 :       unary%d1val1_d1Array(1:33) = -pi*(pi*q1*x%d1Array(1:33)*x%d1val1 + q2*x%d1val1_d1Array(1:33))
     876            0 :    end function cospi_self
     877              : 
     878            0 :    function tanpi_self(x) result(unary)
     879              :       type(auto_diff_real_tdc), intent(in) :: x
     880              :       type(auto_diff_real_tdc) :: unary
     881            0 :       real(dp) :: q2
     882              :       real(dp) :: q1
     883              :       real(dp) :: q0
     884            0 :       q0 = pi*x%val
     885            0 :       q1 = tan(q0)
     886            0 :       q2 = pi*(pow2(q1) + 1)
     887            0 :       unary%val = q1
     888            0 :       unary%d1val1 = q2*x%d1val1
     889            0 :       unary%d1Array(1:33) = q2*x%d1Array(1:33)
     890            0 :       unary%d1val1_d1Array(1:33) = pi*(2.0_dp*pi*q1*x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33))*powm1(pow2(cos(q0)))
     891            0 :    end function tanpi_self
     892              : 
     893            0 :    function sinh_self(x) result(unary)
     894              :       type(auto_diff_real_tdc), intent(in) :: x
     895              :       type(auto_diff_real_tdc) :: unary
     896            0 :       real(dp) :: q1
     897            0 :       real(dp) :: q0
     898            0 :       q0 = sinh(x%val)
     899            0 :       q1 = cosh(x%val)
     900            0 :       unary%val = q0
     901            0 :       unary%d1val1 = q1*x%d1val1
     902            0 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
     903            0 :       unary%d1val1_d1Array(1:33) = q0*x%d1Array(1:33)*x%d1val1 + q1*x%d1val1_d1Array(1:33)
     904            0 :    end function sinh_self
     905              : 
     906            0 :    function cosh_self(x) result(unary)
     907              :       type(auto_diff_real_tdc), intent(in) :: x
     908              :       type(auto_diff_real_tdc) :: unary
     909            0 :       real(dp) :: q1
     910            0 :       real(dp) :: q0
     911            0 :       q0 = cosh(x%val)
     912            0 :       q1 = sinh(x%val)
     913            0 :       unary%val = q0
     914            0 :       unary%d1val1 = q1*x%d1val1
     915            0 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
     916            0 :       unary%d1val1_d1Array(1:33) = q0*x%d1Array(1:33)*x%d1val1 + q1*x%d1val1_d1Array(1:33)
     917            0 :    end function cosh_self
     918              : 
     919        37084 :    function tanh_self(x) result(unary)
     920              :       type(auto_diff_real_tdc), intent(in) :: x
     921              :       type(auto_diff_real_tdc) :: unary
     922        37084 :       real(dp) :: q1
     923              :       real(dp) :: q0
     924        37084 :       q0 = tanh(x%val)
     925        37084 :       q1 = pow2(q0) - 1
     926        37084 :       unary%val = q0
     927        37084 :       unary%d1val1 = -q1*x%d1val1
     928      1260856 :       unary%d1Array(1:33) = -q1*x%d1Array(1:33)
     929      1260856 :       unary%d1val1_d1Array(1:33) = -(2.0_dp*q0*x%d1Array(1:33)*x%d1val1 - x%d1val1_d1Array(1:33))*powm1(pow2(cosh(x%val)))
     930        37084 :    end function tanh_self
     931              : 
     932            0 :    function asin_self(x) result(unary)
     933              :       type(auto_diff_real_tdc), intent(in) :: x
     934              :       type(auto_diff_real_tdc) :: unary
     935            0 :       real(dp) :: q1
     936            0 :       real(dp) :: q0
     937            0 :       q0 = 1 - pow2(x%val)
     938            0 :       q1 = powm1(sqrt(q0))
     939            0 :       unary%val = asin(x%val)
     940            0 :       unary%d1val1 = q1*x%d1val1
     941            0 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
     942            0 :       unary%d1val1_d1Array(1:33) = (q0*x%d1val1_d1Array(1:33) + x%d1Array(1:33)*x%d1val1*x%val)*powm1(pow3(sqrt(q0)))
     943            0 :    end function asin_self
     944              : 
     945            0 :    function acos_self(x) result(unary)
     946              :       type(auto_diff_real_tdc), intent(in) :: x
     947              :       type(auto_diff_real_tdc) :: unary
     948            0 :       real(dp) :: q2
     949            0 :       real(dp) :: q1
     950            0 :       real(dp) :: q0
     951            0 :       q0 = pow2(x%val)
     952            0 :       q1 = 1 - q0
     953            0 :       q2 = powm1(sqrt(q1))
     954            0 :       unary%val = acos(x%val)
     955            0 :       unary%d1val1 = -q2*x%d1val1
     956            0 :       unary%d1Array(1:33) = -q2*x%d1Array(1:33)
     957            0 :       unary%d1val1_d1Array(1:33) = -(x%d1Array(1:33)*x%d1val1*x%val - x%d1val1_d1Array(1:33)*(q0 - 1))*powm1(pow3(sqrt(q1)))
     958            0 :    end function acos_self
     959              : 
     960       118118 :    function atan_self(x) result(unary)
     961              :       type(auto_diff_real_tdc), intent(in) :: x
     962              :       type(auto_diff_real_tdc) :: unary
     963       118118 :       real(dp) :: q1
     964              :       real(dp) :: q0
     965       118118 :       q0 = pow2(x%val) + 1
     966       118118 :       q1 = powm1(q0)
     967       118118 :       unary%val = atan(x%val)
     968       118118 :       unary%d1val1 = q1*x%d1val1
     969      4016012 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
     970      4016012 :       unary%d1val1_d1Array(1:33) = (-2.0_dp*x%d1Array(1:33)*x%d1val1*x%val + q0*x%d1val1_d1Array(1:33))*powm1(pow2(q0))
     971       118118 :    end function atan_self
     972              : 
     973            0 :    function asinpi_self(x) result(unary)
     974              :       type(auto_diff_real_tdc), intent(in) :: x
     975              :       type(auto_diff_real_tdc) :: unary
     976            0 :       real(dp) :: q2
     977            0 :       real(dp) :: q1
     978            0 :       real(dp) :: q0
     979            0 :       q0 = powm1(pi)
     980            0 :       q1 = 1 - pow2(x%val)
     981            0 :       q2 = q0*powm1(sqrt(q1))
     982            0 :       unary%val = q0*asin(x%val)
     983            0 :       unary%d1val1 = q2*x%d1val1
     984            0 :       unary%d1Array(1:33) = q2*x%d1Array(1:33)
     985            0 :       unary%d1val1_d1Array(1:33) = q0*(q1*x%d1val1_d1Array(1:33) + x%d1Array(1:33)*x%d1val1*x%val)*powm1(pow3(sqrt(q1)))
     986            0 :    end function asinpi_self
     987              : 
     988            0 :    function acospi_self(x) result(unary)
     989              :       type(auto_diff_real_tdc), intent(in) :: x
     990              :       type(auto_diff_real_tdc) :: unary
     991            0 :       real(dp) :: q3
     992            0 :       real(dp) :: q2
     993            0 :       real(dp) :: q1
     994            0 :       real(dp) :: q0
     995            0 :       q0 = powm1(pi)
     996            0 :       q1 = pow2(x%val)
     997            0 :       q2 = 1 - q1
     998            0 :       q3 = q0*powm1(sqrt(q2))
     999            0 :       unary%val = q0*acos(x%val)
    1000            0 :       unary%d1val1 = -q3*x%d1val1
    1001            0 :       unary%d1Array(1:33) = -q3*x%d1Array(1:33)
    1002            0 :       unary%d1val1_d1Array(1:33) = -q0*(x%d1Array(1:33)*x%d1val1*x%val - x%d1val1_d1Array(1:33)*(q1 - 1))*powm1(pow3(sqrt(q2)))
    1003            0 :    end function acospi_self
    1004              : 
    1005            0 :    function atanpi_self(x) result(unary)
    1006              :       type(auto_diff_real_tdc), intent(in) :: x
    1007              :       type(auto_diff_real_tdc) :: unary
    1008            0 :       real(dp) :: q2
    1009            0 :       real(dp) :: q1
    1010            0 :       real(dp) :: q0
    1011            0 :       q0 = pow2(x%val)
    1012            0 :       q1 = pi*q0
    1013            0 :       q2 = powm1(pi + q1)
    1014            0 :       unary%val = powm1(pi)*atan(x%val)
    1015            0 :       unary%d1val1 = q2*x%d1val1
    1016            0 :       unary%d1Array(1:33) = q2*x%d1Array(1:33)
    1017              :       unary%d1val1_d1Array(1:33) = (-2.0_dp*x%d1Array(1:33)*x%d1val1*x%val + q0*x%d1val1_d1Array(1:33) + x%d1val1_d1Array(1:33)) &
    1018            0 :                                    * powm1(2.0_dp*q1 + pi*pow4(x%val) + pi)
    1019            0 :    end function atanpi_self
    1020              : 
    1021            0 :    function asinh_self(x) result(unary)
    1022              :       type(auto_diff_real_tdc), intent(in) :: x
    1023              :       type(auto_diff_real_tdc) :: unary
    1024            0 :       real(dp) :: q1
    1025            0 :       real(dp) :: q0
    1026            0 :       q0 = pow2(x%val) + 1
    1027            0 :       q1 = powm1(sqrt(q0))
    1028            0 :       unary%val = asinh(x%val)
    1029            0 :       unary%d1val1 = q1*x%d1val1
    1030            0 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
    1031            0 :       unary%d1val1_d1Array(1:33) = (q0*x%d1val1_d1Array(1:33) - x%d1Array(1:33)*x%d1val1*x%val)*powm1(pow3(sqrt(q0)))
    1032            0 :    end function asinh_self
    1033              : 
    1034            0 :    function acosh_self(x) result(unary)
    1035              :       type(auto_diff_real_tdc), intent(in) :: x
    1036              :       type(auto_diff_real_tdc) :: unary
    1037            0 :       real(dp) :: q1
    1038            0 :       real(dp) :: q0
    1039            0 :       q0 = pow2(x%val) - 1
    1040            0 :       q1 = powm1(sqrt(q0))
    1041            0 :       unary%val = acosh(x%val)
    1042            0 :       unary%d1val1 = q1*x%d1val1
    1043            0 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
    1044            0 :       unary%d1val1_d1Array(1:33) = (q0*x%d1val1_d1Array(1:33) - x%d1Array(1:33)*x%d1val1*x%val)*powm1(pow3(sqrt(q0)))
    1045            0 :    end function acosh_self
    1046              : 
    1047            0 :    function atanh_self(x) result(unary)
    1048              :       type(auto_diff_real_tdc), intent(in) :: x
    1049              :       type(auto_diff_real_tdc) :: unary
    1050            0 :       real(dp) :: q1
    1051              :       real(dp) :: q0
    1052            0 :       q0 = pow2(x%val) - 1
    1053            0 :       q1 = powm1(q0)
    1054            0 :       unary%val = atanh(x%val)
    1055            0 :       unary%d1val1 = -q1*x%d1val1
    1056            0 :       unary%d1Array(1:33) = -q1*x%d1Array(1:33)
    1057            0 :       unary%d1val1_d1Array(1:33) = (2.0_dp*x%d1Array(1:33)*x%d1val1*x%val - q0*x%d1val1_d1Array(1:33))*powm1(pow2(q0))
    1058            0 :    end function atanh_self
    1059              : 
    1060       239184 :    function sqrt_self(x) result(unary)
    1061              :       type(auto_diff_real_tdc), intent(in) :: x
    1062              :       type(auto_diff_real_tdc) :: unary
    1063       239184 :       real(dp) :: q1
    1064              :       real(dp) :: q0
    1065       239184 :       q0 = sqrt(x%val)
    1066       239184 :       q1 = 0.5_dp*powm1(q0)
    1067       239184 :       unary%val = q0
    1068       239184 :       unary%d1val1 = q1*x%d1val1
    1069      8132256 :       unary%d1Array(1:33) = q1*x%d1Array(1:33)
    1070      8132256 :       unary%d1val1_d1Array(1:33) = 0.25_dp*(2.0_dp*x%d1val1_d1Array(1:33)*x%val - x%d1Array(1:33)*x%d1val1)*powm1(pow3(sqrt(x%val)))
    1071       239184 :    end function sqrt_self
    1072              : 
    1073       304426 :    function pow2_self(x) result(unary)
    1074              :       type(auto_diff_real_tdc), intent(in) :: x
    1075              :       type(auto_diff_real_tdc) :: unary
    1076       304426 :       real(dp) :: q0
    1077       304426 :       q0 = 2.0_dp*x%val
    1078       304426 :       unary%val = pow2(x%val)
    1079       304426 :       unary%d1val1 = q0*x%d1val1
    1080     10350484 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1081     10350484 :       unary%d1val1_d1Array(1:33) = 2.0_dp*x%d1Array(1:33)*x%d1val1 + q0*x%d1val1_d1Array(1:33)
    1082       304426 :    end function pow2_self
    1083              : 
    1084            0 :    function pow3_self(x) result(unary)
    1085              :       type(auto_diff_real_tdc), intent(in) :: x
    1086              :       type(auto_diff_real_tdc) :: unary
    1087            0 :       real(dp) :: q0
    1088            0 :       q0 = 3.0_dp*pow2(x%val)
    1089            0 :       unary%val = pow3(x%val)
    1090            0 :       unary%d1val1 = q0*x%d1val1
    1091            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1092            0 :       unary%d1val1_d1Array(1:33) = 3.0_dp*x%val*(2.0_dp*x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33)*x%val)
    1093            0 :    end function pow3_self
    1094              : 
    1095            0 :    function pow4_self(x) result(unary)
    1096              :       type(auto_diff_real_tdc), intent(in) :: x
    1097              :       type(auto_diff_real_tdc) :: unary
    1098            0 :       real(dp) :: q0
    1099            0 :       q0 = 4.0_dp*pow3(x%val)
    1100            0 :       unary%val = pow4(x%val)
    1101            0 :       unary%d1val1 = q0*x%d1val1
    1102            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1103            0 :       unary%d1val1_d1Array(1:33) = 4.0_dp*(3.0_dp*x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33)*x%val)*pow2(x%val)
    1104            0 :    end function pow4_self
    1105              : 
    1106            0 :    function pow5_self(x) result(unary)
    1107              :       type(auto_diff_real_tdc), intent(in) :: x
    1108              :       type(auto_diff_real_tdc) :: unary
    1109            0 :       real(dp) :: q0
    1110            0 :       q0 = 5.0_dp*pow4(x%val)
    1111            0 :       unary%val = pow5(x%val)
    1112            0 :       unary%d1val1 = q0*x%d1val1
    1113            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1114            0 :       unary%d1val1_d1Array(1:33) = 5.0_dp*(4.0_dp*x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33)*x%val)*pow3(x%val)
    1115            0 :    end function pow5_self
    1116              : 
    1117            0 :    function pow6_self(x) result(unary)
    1118              :       type(auto_diff_real_tdc), intent(in) :: x
    1119              :       type(auto_diff_real_tdc) :: unary
    1120            0 :       real(dp) :: q0
    1121            0 :       q0 = 6.0_dp*pow5(x%val)
    1122            0 :       unary%val = pow6(x%val)
    1123            0 :       unary%d1val1 = q0*x%d1val1
    1124            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1125            0 :       unary%d1val1_d1Array(1:33) = 6.0_dp*(5.0_dp*x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33)*x%val)*pow4(x%val)
    1126            0 :    end function pow6_self
    1127              : 
    1128            0 :    function pow7_self(x) result(unary)
    1129              :       type(auto_diff_real_tdc), intent(in) :: x
    1130              :       type(auto_diff_real_tdc) :: unary
    1131            0 :       real(dp) :: q0
    1132            0 :       q0 = 7.0_dp*pow6(x%val)
    1133            0 :       unary%val = pow7(x%val)
    1134            0 :       unary%d1val1 = q0*x%d1val1
    1135            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1136            0 :       unary%d1val1_d1Array(1:33) = 7.0_dp*(6.0_dp*x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33)*x%val)*pow5(x%val)
    1137            0 :    end function pow7_self
    1138              : 
    1139            0 :    function pow8_self(x) result(unary)
    1140              :       type(auto_diff_real_tdc), intent(in) :: x
    1141              :       type(auto_diff_real_tdc) :: unary
    1142            0 :       real(dp) :: q0
    1143            0 :       q0 = 8.0_dp*pow7(x%val)
    1144            0 :       unary%val = pow8(x%val)
    1145            0 :       unary%d1val1 = q0*x%d1val1
    1146            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1147            0 :       unary%d1val1_d1Array(1:33) = 8.0_dp*(7.0_dp*x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33)*x%val)*pow6(x%val)
    1148            0 :    end function pow8_self
    1149              : 
    1150       335574 :    function abs_self(x) result(unary)
    1151              :       type(auto_diff_real_tdc), intent(in) :: x
    1152              :       type(auto_diff_real_tdc) :: unary
    1153       335574 :       real(dp) :: q0
    1154       335574 :       q0 = sgn(x%val)
    1155       335574 :       unary%val = Abs(x%val)
    1156       335574 :       unary%d1val1 = q0*x%d1val1
    1157     11409516 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1158     11409516 :       unary%d1val1_d1Array(1:33) = q0*x%d1val1_d1Array(1:33)
    1159       335574 :    end function abs_self
    1160              : 
    1161      1024083 :    function add_self(x, y) result(binary)
    1162              :       type(auto_diff_real_tdc), intent(in) :: x
    1163              :       type(auto_diff_real_tdc), intent(in) :: y
    1164              :       type(auto_diff_real_tdc) :: binary
    1165      1024083 :       binary%val = x%val + y%val
    1166      1024083 :       binary%d1val1 = x%d1val1 + y%d1val1
    1167     34818822 :       binary%d1Array(1:33) = x%d1Array(1:33) + y%d1Array(1:33)
    1168     34818822 :       binary%d1val1_d1Array(1:33) = x%d1val1_d1Array(1:33) + y%d1val1_d1Array(1:33)
    1169      1024083 :    end function add_self
    1170              : 
    1171            0 :    function add_self_real(x, y) result(unary)
    1172              :       type(auto_diff_real_tdc), intent(in) :: x
    1173              :       real(dp), intent(in) :: y
    1174              :       type(auto_diff_real_tdc) :: unary
    1175            0 :       unary%val = x%val + y
    1176            0 :       unary%d1val1 = x%d1val1
    1177            0 :       unary%d1Array(1:33) = x%d1Array(1:33)
    1178            0 :       unary%d1val1_d1Array(1:33) = x%d1val1_d1Array(1:33)
    1179            0 :    end function add_self_real
    1180              : 
    1181            0 :    function add_real_self(z, x) result(unary)
    1182              :       real(dp), intent(in) :: z
    1183              :       type(auto_diff_real_tdc), intent(in) :: x
    1184              :       type(auto_diff_real_tdc) :: unary
    1185            0 :       unary%val = x%val + z
    1186            0 :       unary%d1val1 = x%d1val1
    1187            0 :       unary%d1Array(1:33) = x%d1Array(1:33)
    1188            0 :       unary%d1val1_d1Array(1:33) = x%d1val1_d1Array(1:33)
    1189            0 :    end function add_real_self
    1190              : 
    1191            0 :    function add_self_int(x, y) result(unary)
    1192              :       type(auto_diff_real_tdc), intent(in) :: x
    1193              :       integer, intent(in) :: y
    1194              :       type(auto_diff_real_tdc) :: unary
    1195            0 :       real(dp) :: y_dp
    1196            0 :       y_dp = y
    1197            0 :       unary%val = x%val + y_dp
    1198            0 :       unary%d1val1 = x%d1val1
    1199            0 :       unary%d1Array(1:33) = x%d1Array(1:33)
    1200            0 :       unary%d1val1_d1Array(1:33) = x%d1val1_d1Array(1:33)
    1201            0 :    end function add_self_int
    1202              : 
    1203            0 :    function add_int_self(z, x) result(unary)
    1204              :       integer, intent(in) :: z
    1205              :       type(auto_diff_real_tdc), intent(in) :: x
    1206              :       type(auto_diff_real_tdc) :: unary
    1207            0 :       real(dp) :: y_dp
    1208            0 :       y_dp = z
    1209            0 :       unary%val = x%val + y_dp
    1210            0 :       unary%d1val1 = x%d1val1
    1211            0 :       unary%d1Array(1:33) = x%d1Array(1:33)
    1212            0 :       unary%d1val1_d1Array(1:33) = x%d1val1_d1Array(1:33)
    1213            0 :    end function add_int_self
    1214              : 
    1215      1586503 :    function sub_self(x, y) result(binary)
    1216              :       type(auto_diff_real_tdc), intent(in) :: x
    1217              :       type(auto_diff_real_tdc), intent(in) :: y
    1218              :       type(auto_diff_real_tdc) :: binary
    1219      1586503 :       binary%val = x%val - y%val
    1220      1586503 :       binary%d1val1 = x%d1val1 - y%d1val1
    1221     53941102 :       binary%d1Array(1:33) = x%d1Array(1:33) - y%d1Array(1:33)
    1222     53941102 :       binary%d1val1_d1Array(1:33) = x%d1val1_d1Array(1:33) - y%d1val1_d1Array(1:33)
    1223      1586503 :    end function sub_self
    1224              : 
    1225            0 :    function sub_self_real(x, y) result(unary)
    1226              :       type(auto_diff_real_tdc), intent(in) :: x
    1227              :       real(dp), intent(in) :: y
    1228              :       type(auto_diff_real_tdc) :: unary
    1229            0 :       unary%val = x%val - y
    1230            0 :       unary%d1val1 = x%d1val1
    1231            0 :       unary%d1Array(1:33) = x%d1Array(1:33)
    1232            0 :       unary%d1val1_d1Array(1:33) = x%d1val1_d1Array(1:33)
    1233            0 :    end function sub_self_real
    1234              : 
    1235            0 :    function sub_real_self(z, x) result(unary)
    1236              :       real(dp), intent(in) :: z
    1237              :       type(auto_diff_real_tdc), intent(in) :: x
    1238              :       type(auto_diff_real_tdc) :: unary
    1239            0 :       unary%val = -x%val + z
    1240            0 :       unary%d1val1 = -x%d1val1
    1241            0 :       unary%d1Array(1:33) = -x%d1Array(1:33)
    1242            0 :       unary%d1val1_d1Array(1:33) = -x%d1val1_d1Array(1:33)
    1243            0 :    end function sub_real_self
    1244              : 
    1245            0 :    function sub_self_int(x, y) result(unary)
    1246              :       type(auto_diff_real_tdc), intent(in) :: x
    1247              :       integer, intent(in) :: y
    1248              :       type(auto_diff_real_tdc) :: unary
    1249            0 :       real(dp) :: y_dp
    1250            0 :       y_dp = y
    1251            0 :       unary%val = x%val - y_dp
    1252            0 :       unary%d1val1 = x%d1val1
    1253            0 :       unary%d1Array(1:33) = x%d1Array(1:33)
    1254            0 :       unary%d1val1_d1Array(1:33) = x%d1val1_d1Array(1:33)
    1255            0 :    end function sub_self_int
    1256              : 
    1257            0 :    function sub_int_self(z, x) result(unary)
    1258              :       integer, intent(in) :: z
    1259              :       type(auto_diff_real_tdc), intent(in) :: x
    1260              :       type(auto_diff_real_tdc) :: unary
    1261            0 :       real(dp) :: y_dp
    1262            0 :       y_dp = z
    1263            0 :       unary%val = -x%val + y_dp
    1264            0 :       unary%d1val1 = -x%d1val1
    1265            0 :       unary%d1Array(1:33) = -x%d1Array(1:33)
    1266            0 :       unary%d1val1_d1Array(1:33) = -x%d1val1_d1Array(1:33)
    1267            0 :    end function sub_int_self
    1268              : 
    1269      3341599 :    function mul_self(x, y) result(binary)
    1270              :       type(auto_diff_real_tdc), intent(in) :: x
    1271              :       type(auto_diff_real_tdc), intent(in) :: y
    1272              :       type(auto_diff_real_tdc) :: binary
    1273      3341599 :       binary%val = x%val*y%val
    1274      3341599 :       binary%d1val1 = x%d1val1*y%val + x%val*y%d1val1
    1275    113614366 :       binary%d1Array(1:33) = x%d1Array(1:33)*y%val + x%val*y%d1Array(1:33)
    1276              :       binary%d1val1_d1Array(1:33) = x%d1Array(1:33)*y%d1val1 + x%d1val1*y%d1Array(1:33) &
    1277    113614366 :                                     + x%d1val1_d1Array(1:33)*y%val + x%val*y%d1val1_d1Array(1:33)
    1278      3341599 :    end function mul_self
    1279              : 
    1280            0 :    function mul_self_real(x, y) result(unary)
    1281              :       type(auto_diff_real_tdc), intent(in) :: x
    1282              :       real(dp), intent(in) :: y
    1283              :       type(auto_diff_real_tdc) :: unary
    1284            0 :       unary%val = x%val*y
    1285            0 :       unary%d1val1 = x%d1val1*y
    1286            0 :       unary%d1Array(1:33) = x%d1Array(1:33)*y
    1287            0 :       unary%d1val1_d1Array(1:33) = x%d1val1_d1Array(1:33)*y
    1288            0 :    end function mul_self_real
    1289              : 
    1290       965283 :    function mul_real_self(z, x) result(unary)
    1291              :       real(dp), intent(in) :: z
    1292              :       type(auto_diff_real_tdc), intent(in) :: x
    1293              :       type(auto_diff_real_tdc) :: unary
    1294       965283 :       unary%val = x%val*z
    1295       965283 :       unary%d1val1 = x%d1val1*z
    1296     32819622 :       unary%d1Array(1:33) = x%d1Array(1:33)*z
    1297     32819622 :       unary%d1val1_d1Array(1:33) = x%d1val1_d1Array(1:33)*z
    1298       965283 :    end function mul_real_self
    1299              : 
    1300            0 :    function mul_self_int(x, y) result(unary)
    1301              :       type(auto_diff_real_tdc), intent(in) :: x
    1302              :       integer, intent(in) :: y
    1303              :       type(auto_diff_real_tdc) :: unary
    1304            0 :       real(dp) :: y_dp
    1305            0 :       y_dp = y
    1306            0 :       unary%val = x%val*y_dp
    1307            0 :       unary%d1val1 = x%d1val1*y_dp
    1308            0 :       unary%d1Array(1:33) = x%d1Array(1:33)*y_dp
    1309            0 :       unary%d1val1_d1Array(1:33) = x%d1val1_d1Array(1:33)*y_dp
    1310            0 :    end function mul_self_int
    1311              : 
    1312            0 :    function mul_int_self(z, x) result(unary)
    1313              :       integer, intent(in) :: z
    1314              :       type(auto_diff_real_tdc), intent(in) :: x
    1315              :       type(auto_diff_real_tdc) :: unary
    1316            0 :       real(dp) :: y_dp
    1317            0 :       y_dp = z
    1318            0 :       unary%val = x%val*y_dp
    1319            0 :       unary%d1val1 = x%d1val1*y_dp
    1320            0 :       unary%d1Array(1:33) = x%d1Array(1:33)*y_dp
    1321            0 :       unary%d1val1_d1Array(1:33) = x%d1val1_d1Array(1:33)*y_dp
    1322            0 :    end function mul_int_self
    1323              : 
    1324       388998 :    function div_self(x, y) result(binary)
    1325              :       type(auto_diff_real_tdc), intent(in) :: x
    1326              :       type(auto_diff_real_tdc), intent(in) :: y
    1327              :       type(auto_diff_real_tdc) :: binary
    1328       388998 :       real(dp) :: q2
    1329       388998 :       real(dp) :: q1
    1330              :       real(dp) :: q0
    1331       388998 :       q0 = pow2(y%val)
    1332       388998 :       q1 = powm1(q0)
    1333       388998 :       q2 = x%val*y%d1val1
    1334       388998 :       binary%val = x%val*powm1(y%val)
    1335       388998 :       binary%d1val1 = q1*(-q2 + x%d1val1*y%val)
    1336     13225932 :       binary%d1Array(1:33) = q1*(x%d1Array(1:33)*y%val - x%val*y%d1Array(1:33))
    1337              :       binary%d1val1_d1Array(1:33) = (2.0_dp*q2*y%d1Array(1:33) + q0*x%d1val1_d1Array(1:33) &
    1338              :                                     - y%val*(x%d1Array(1:33)*y%d1val1 + x%d1val1*y%d1Array(1:33) &
    1339     13225932 :                                     + x%val*y%d1val1_d1Array(1:33)))*powm1(pow3(y%val))
    1340       388998 :    end function div_self
    1341              : 
    1342        83365 :    function div_self_real(x, y) result(unary)
    1343              :       type(auto_diff_real_tdc), intent(in) :: x
    1344              :       real(dp), intent(in) :: y
    1345              :       type(auto_diff_real_tdc) :: unary
    1346        83365 :       real(dp) :: q0
    1347        83365 :       q0 = powm1(y)
    1348        83365 :       unary%val = q0*x%val
    1349        83365 :       unary%d1val1 = q0*x%d1val1
    1350      2834410 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1351      2834410 :       unary%d1val1_d1Array(1:33) = q0*x%d1val1_d1Array(1:33)
    1352        83365 :    end function div_self_real
    1353              : 
    1354            0 :    function div_real_self(z, x) result(unary)
    1355              :       real(dp), intent(in) :: z
    1356              :       type(auto_diff_real_tdc), intent(in) :: x
    1357              :       type(auto_diff_real_tdc) :: unary
    1358            0 :       real(dp) :: q0
    1359            0 :       q0 = z*powm1(pow2(x%val))
    1360            0 :       unary%val = z*powm1(x%val)
    1361            0 :       unary%d1val1 = -q0*x%d1val1
    1362            0 :       unary%d1Array(1:33) = -q0*x%d1Array(1:33)
    1363            0 :       unary%d1val1_d1Array(1:33) = z*(2.0_dp*x%d1Array(1:33)*x%d1val1 - x%d1val1_d1Array(1:33)*x%val)*powm1(pow3(x%val))
    1364            0 :    end function div_real_self
    1365              : 
    1366            0 :    function div_self_int(x, y) result(unary)
    1367              :       type(auto_diff_real_tdc), intent(in) :: x
    1368              :       integer, intent(in) :: y
    1369              :       type(auto_diff_real_tdc) :: unary
    1370              :       real(dp) :: y_dp
    1371            0 :       real(dp) :: q0
    1372            0 :       y_dp = y
    1373            0 :       q0 = powm1(y_dp)
    1374            0 :       unary%val = q0*x%val
    1375            0 :       unary%d1val1 = q0*x%d1val1
    1376            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1377            0 :       unary%d1val1_d1Array(1:33) = q0*x%d1val1_d1Array(1:33)
    1378            0 :    end function div_self_int
    1379              : 
    1380            0 :    function div_int_self(z, x) result(unary)
    1381              :       integer, intent(in) :: z
    1382              :       type(auto_diff_real_tdc), intent(in) :: x
    1383              :       type(auto_diff_real_tdc) :: unary
    1384            0 :       real(dp) :: y_dp
    1385            0 :       real(dp) :: q0
    1386            0 :       y_dp = z
    1387            0 :       q0 = y_dp*powm1(pow2(x%val))
    1388            0 :       unary%val = y_dp*powm1(x%val)
    1389            0 :       unary%d1val1 = -q0*x%d1val1
    1390            0 :       unary%d1Array(1:33) = -q0*x%d1Array(1:33)
    1391            0 :       unary%d1val1_d1Array(1:33) = y_dp*(2.0_dp*x%d1Array(1:33)*x%d1val1 - x%d1val1_d1Array(1:33)*x%val)*powm1(pow3(x%val))
    1392            0 :    end function div_int_self
    1393              : 
    1394            0 :    function pow_self(x, y) result(binary)
    1395              :       type(auto_diff_real_tdc), intent(in) :: x
    1396              :       type(auto_diff_real_tdc), intent(in) :: y
    1397              :       type(auto_diff_real_tdc) :: binary
    1398            0 :       real(dp) :: q5(1:33)
    1399            0 :       real(dp) :: q4
    1400            0 :       real(dp) :: q3
    1401            0 :       real(dp) :: q2
    1402            0 :       real(dp) :: q1
    1403            0 :       real(dp) :: q0
    1404            0 :       q0 = pow(x%val, y%val - 1)
    1405            0 :       q1 = x%d1val1*y%val
    1406            0 :       q2 = log(x%val)
    1407            0 :       q3 = q2*x%val
    1408            0 :       q4 = q1 + q3*y%d1val1
    1409            0 :       q5(1:33) = q3*y%d1Array(1:33) + x%d1Array(1:33)*y%val
    1410            0 :       binary%val = pow(x%val, y%val)
    1411            0 :       binary%d1val1 = q0*q4
    1412            0 :       binary%d1Array(1:33) = q0*q5
    1413              :       binary%d1val1_d1Array(1:33) = (-q1*x%d1Array(1:33) + q2*y%d1val1_d1Array(1:33)*pow2(x%val) &
    1414              :                                     + q4*q5 + x%val*(x%d1Array(1:33)*y%d1val1 + x%d1val1*y%d1Array(1:33) &
    1415            0 :                                     + x%d1val1_d1Array(1:33)*y%val))*pow(x%val, 3.0_dp + y%val)*powm1(pow5(x%val))
    1416            0 :    end function pow_self
    1417              : 
    1418            0 :    function pow_self_real(x, y) result(unary)
    1419              :       type(auto_diff_real_tdc), intent(in) :: x
    1420              :       real(dp), intent(in) :: y
    1421              :       type(auto_diff_real_tdc) :: unary
    1422            0 :       real(dp) :: q1(1:33)
    1423            0 :       real(dp) :: q0
    1424            0 :       q0 = y*pow(x%val, y - 1)
    1425            0 :       q1(1:33) = x%d1Array(1:33)*x%d1val1
    1426            0 :       unary%val = pow(x%val, y)
    1427            0 :       unary%d1val1 = q0*x%d1val1
    1428            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1429            0 :       unary%d1val1_d1Array(1:33) = y*(q1*y - q1 + x%d1val1_d1Array(1:33)*x%val)*pow(x%val, -2.0_dp + y)
    1430            0 :    end function pow_self_real
    1431              : 
    1432            0 :    function pow_real_self(z, x) result(unary)
    1433              :       real(dp), intent(in) :: z
    1434              :       type(auto_diff_real_tdc), intent(in) :: x
    1435              :       type(auto_diff_real_tdc) :: unary
    1436            0 :       real(dp) :: q2
    1437            0 :       real(dp) :: q1
    1438            0 :       real(dp) :: q0
    1439            0 :       q0 = pow(z, x%val)
    1440            0 :       q1 = log(z)
    1441            0 :       q2 = q0*q1
    1442            0 :       unary%val = q0
    1443            0 :       unary%d1val1 = q2*x%d1val1
    1444            0 :       unary%d1Array(1:33) = q2*x%d1Array(1:33)
    1445            0 :       unary%d1val1_d1Array(1:33) = q2*(q1*x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33))
    1446            0 :    end function pow_real_self
    1447              : 
    1448            0 :    function pow_self_int(x, y) result(unary)
    1449              :       type(auto_diff_real_tdc), intent(in) :: x
    1450              :       integer, intent(in) :: y
    1451              :       type(auto_diff_real_tdc) :: unary
    1452              :       real(dp) :: y_dp
    1453            0 :       real(dp) :: q1(1:33)
    1454            0 :       real(dp) :: q0
    1455            0 :       y_dp = y
    1456            0 :       q0 = y_dp*pow(x%val, y_dp - 1)
    1457            0 :       q1(1:33) = x%d1Array(1:33)*x%d1val1
    1458            0 :       unary%val = pow(x%val, y_dp)
    1459            0 :       unary%d1val1 = q0*x%d1val1
    1460            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1461            0 :       unary%d1val1_d1Array(1:33) = y_dp*(q1*y_dp - q1 + x%d1val1_d1Array(1:33)*x%val)*pow(x%val, -2.0_dp + y_dp)
    1462            0 :    end function pow_self_int
    1463              : 
    1464            0 :    function pow_int_self(z, x) result(unary)
    1465              :       integer, intent(in) :: z
    1466              :       type(auto_diff_real_tdc), intent(in) :: x
    1467              :       type(auto_diff_real_tdc) :: unary
    1468              :       real(dp) :: y_dp
    1469            0 :       real(dp) :: q2
    1470            0 :       real(dp) :: q1
    1471            0 :       real(dp) :: q0
    1472            0 :       y_dp = z
    1473            0 :       q0 = pow(y_dp, x%val)
    1474            0 :       q1 = log(y_dp)
    1475            0 :       q2 = q0*q1
    1476            0 :       unary%val = q0
    1477            0 :       unary%d1val1 = q2*x%d1val1
    1478            0 :       unary%d1Array(1:33) = q2*x%d1Array(1:33)
    1479            0 :       unary%d1val1_d1Array(1:33) = q2*(q1*x%d1Array(1:33)*x%d1val1 + x%d1val1_d1Array(1:33))
    1480            0 :    end function pow_int_self
    1481              : 
    1482            0 :    function max_self(x, y) result(binary)
    1483              :       type(auto_diff_real_tdc), intent(in) :: x
    1484              :       type(auto_diff_real_tdc), intent(in) :: y
    1485              :       type(auto_diff_real_tdc) :: binary
    1486            0 :       real(dp) :: q1
    1487            0 :       real(dp) :: q0
    1488            0 :       q0 = Heaviside(x%val - y%val)
    1489            0 :       q1 = Heaviside(-x%val + y%val)
    1490            0 :       binary%val = Max(x%val, y%val)
    1491            0 :       binary%d1val1 = q0*x%d1val1 + q1*y%d1val1
    1492            0 :       binary%d1Array(1:33) = q0*x%d1Array(1:33) + q1*y%d1Array(1:33)
    1493            0 :       binary%d1val1_d1Array(1:33) = q0*x%d1val1_d1Array(1:33) + q1*y%d1val1_d1Array(1:33)
    1494            0 :    end function max_self
    1495              : 
    1496            0 :    function max_self_real(x, y) result(unary)
    1497              :       type(auto_diff_real_tdc), intent(in) :: x
    1498              :       real(dp), intent(in) :: y
    1499              :       type(auto_diff_real_tdc) :: unary
    1500            0 :       real(dp) :: q0
    1501            0 :       q0 = Heaviside(x%val - y)
    1502            0 :       unary%val = Max(x%val, y)
    1503            0 :       unary%d1val1 = q0*x%d1val1
    1504            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1505            0 :       unary%d1val1_d1Array(1:33) = q0*x%d1val1_d1Array(1:33)
    1506            0 :    end function max_self_real
    1507              : 
    1508            0 :    function max_real_self(z, x) result(unary)
    1509              :       real(dp), intent(in) :: z
    1510              :       type(auto_diff_real_tdc), intent(in) :: x
    1511              :       type(auto_diff_real_tdc) :: unary
    1512            0 :       real(dp) :: q0
    1513            0 :       q0 = Heaviside(x%val - z)
    1514            0 :       unary%val = Max(x%val, z)
    1515            0 :       unary%d1val1 = q0*x%d1val1
    1516            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1517            0 :       unary%d1val1_d1Array(1:33) = q0*x%d1val1_d1Array(1:33)
    1518            0 :    end function max_real_self
    1519              : 
    1520            0 :    function max_self_int(x, y) result(unary)
    1521              :       type(auto_diff_real_tdc), intent(in) :: x
    1522              :       integer, intent(in) :: y
    1523              :       type(auto_diff_real_tdc) :: unary
    1524            0 :       real(dp) :: y_dp
    1525            0 :       real(dp) :: q0
    1526            0 :       y_dp = y
    1527            0 :       q0 = Heaviside(x%val - y_dp)
    1528            0 :       unary%val = Max(x%val, y_dp)
    1529            0 :       unary%d1val1 = q0*x%d1val1
    1530            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1531            0 :       unary%d1val1_d1Array(1:33) = q0*x%d1val1_d1Array(1:33)
    1532            0 :    end function max_self_int
    1533              : 
    1534            0 :    function max_int_self(z, x) result(unary)
    1535              :       integer, intent(in) :: z
    1536              :       type(auto_diff_real_tdc), intent(in) :: x
    1537              :       type(auto_diff_real_tdc) :: unary
    1538            0 :       real(dp) :: y_dp
    1539            0 :       real(dp) :: q0
    1540            0 :       y_dp = z
    1541            0 :       q0 = Heaviside(x%val - y_dp)
    1542            0 :       unary%val = Max(x%val, y_dp)
    1543            0 :       unary%d1val1 = q0*x%d1val1
    1544            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1545            0 :       unary%d1val1_d1Array(1:33) = q0*x%d1val1_d1Array(1:33)
    1546            0 :    end function max_int_self
    1547              : 
    1548            0 :    function min_self(x, y) result(binary)
    1549              :       type(auto_diff_real_tdc), intent(in) :: x
    1550              :       type(auto_diff_real_tdc), intent(in) :: y
    1551              :       type(auto_diff_real_tdc) :: binary
    1552            0 :       real(dp) :: q1
    1553            0 :       real(dp) :: q0
    1554            0 :       q0 = Heaviside(-x%val + y%val)
    1555            0 :       q1 = Heaviside(x%val - y%val)
    1556            0 :       binary%val = Min(x%val, y%val)
    1557            0 :       binary%d1val1 = q0*x%d1val1 + q1*y%d1val1
    1558            0 :       binary%d1Array(1:33) = q0*x%d1Array(1:33) + q1*y%d1Array(1:33)
    1559            0 :       binary%d1val1_d1Array(1:33) = q0*x%d1val1_d1Array(1:33) + q1*y%d1val1_d1Array(1:33)
    1560            0 :    end function min_self
    1561              : 
    1562            0 :    function min_self_real(x, y) result(unary)
    1563              :       type(auto_diff_real_tdc), intent(in) :: x
    1564              :       real(dp), intent(in) :: y
    1565              :       type(auto_diff_real_tdc) :: unary
    1566            0 :       real(dp) :: q0
    1567            0 :       q0 = Heaviside(-x%val + y)
    1568            0 :       unary%val = Min(x%val, y)
    1569            0 :       unary%d1val1 = q0*x%d1val1
    1570            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1571            0 :       unary%d1val1_d1Array(1:33) = q0*x%d1val1_d1Array(1:33)
    1572            0 :    end function min_self_real
    1573              : 
    1574            0 :    function min_real_self(z, x) result(unary)
    1575              :       real(dp), intent(in) :: z
    1576              :       type(auto_diff_real_tdc), intent(in) :: x
    1577              :       type(auto_diff_real_tdc) :: unary
    1578            0 :       real(dp) :: q0
    1579            0 :       q0 = Heaviside(-x%val + z)
    1580            0 :       unary%val = Min(x%val, z)
    1581            0 :       unary%d1val1 = q0*x%d1val1
    1582            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1583            0 :       unary%d1val1_d1Array(1:33) = q0*x%d1val1_d1Array(1:33)
    1584            0 :    end function min_real_self
    1585              : 
    1586            0 :    function min_self_int(x, y) result(unary)
    1587              :       type(auto_diff_real_tdc), intent(in) :: x
    1588              :       integer, intent(in) :: y
    1589              :       type(auto_diff_real_tdc) :: unary
    1590            0 :       real(dp) :: y_dp
    1591            0 :       real(dp) :: q0
    1592            0 :       y_dp = y
    1593            0 :       q0 = Heaviside(-x%val + y_dp)
    1594            0 :       unary%val = Min(x%val, y_dp)
    1595            0 :       unary%d1val1 = q0*x%d1val1
    1596            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1597            0 :       unary%d1val1_d1Array(1:33) = q0*x%d1val1_d1Array(1:33)
    1598            0 :    end function min_self_int
    1599              : 
    1600            0 :    function min_int_self(z, x) result(unary)
    1601              :       integer, intent(in) :: z
    1602              :       type(auto_diff_real_tdc), intent(in) :: x
    1603              :       type(auto_diff_real_tdc) :: unary
    1604            0 :       real(dp) :: y_dp
    1605            0 :       real(dp) :: q0
    1606            0 :       y_dp = z
    1607            0 :       q0 = Heaviside(-x%val + y_dp)
    1608            0 :       unary%val = Min(x%val, y_dp)
    1609            0 :       unary%d1val1 = q0*x%d1val1
    1610            0 :       unary%d1Array(1:33) = q0*x%d1Array(1:33)
    1611            0 :       unary%d1val1_d1Array(1:33) = q0*x%d1val1_d1Array(1:33)
    1612            0 :    end function min_int_self
    1613              : 
    1614            0 :    function dim_self(x, y) result(binary)
    1615              :       type(auto_diff_real_tdc), intent(in) :: x
    1616              :       type(auto_diff_real_tdc), intent(in) :: y
    1617              :       type(auto_diff_real_tdc) :: binary
    1618            0 :       real(dp) :: q1
    1619              :       real(dp) :: q0
    1620            0 :       q0 = x%val - y%val
    1621            0 :       q1 = 0.5_dp*sgn(q0)
    1622            0 :       binary%val = -0.5_dp*y%val + 0.5_dp*x%val + 0.5_dp*Abs(q0)
    1623            0 :       binary%d1val1 = -0.5_dp*y%d1val1 + 0.5_dp*x%d1val1 + q1*(x%d1val1 - y%d1val1)
    1624            0 :       binary%d1Array(1:33) = -0.5_dp*y%d1Array(1:33) + 0.5_dp*x%d1Array(1:33) + q1*(x%d1Array(1:33) - y%d1Array(1:33))
    1625              :       binary%d1val1_d1Array(1:33) = -0.5_dp*y%d1val1_d1Array(1:33) &
    1626              :                                    + 0.5_dp*x%d1val1_d1Array(1:33) &
    1627            0 :                                    + q1*(x%d1val1_d1Array(1:33) - y%d1val1_d1Array(1:33))
    1628            0 :    end function dim_self
    1629              : 
    1630            0 :    function dim_self_real(x, y) result(unary)
    1631              :       type(auto_diff_real_tdc), intent(in) :: x
    1632              :       real(dp), intent(in) :: y
    1633              :       type(auto_diff_real_tdc) :: unary
    1634            0 :       real(dp) :: q3(1:33)
    1635            0 :       real(dp) :: q2
    1636            0 :       real(dp) :: q1
    1637              :       real(dp) :: q0
    1638            0 :       q0 = x%val - y
    1639            0 :       q1 = sgn(q0)
    1640            0 :       q2 = 0.5_dp*q1 + 0.5_dp
    1641            0 :       q3(1:33) = 0.5_dp*x%d1val1_d1Array(1:33)
    1642            0 :       unary%val = -0.5_dp*y + 0.5_dp*x%val + 0.5_dp*Abs(q0)
    1643            0 :       unary%d1val1 = q2*x%d1val1
    1644            0 :       unary%d1Array(1:33) = q2*x%d1Array(1:33)
    1645            0 :       unary%d1val1_d1Array(1:33) = q1*q3 + q3
    1646            0 :    end function dim_self_real
    1647              : 
    1648            0 :    function dim_real_self(z, x) result(unary)
    1649              :       real(dp), intent(in) :: z
    1650              :       type(auto_diff_real_tdc), intent(in) :: x
    1651              :       type(auto_diff_real_tdc) :: unary
    1652            0 :       real(dp) :: q3(1:33)
    1653            0 :       real(dp) :: q2
    1654            0 :       real(dp) :: q1
    1655              :       real(dp) :: q0
    1656            0 :       q0 = x%val - z
    1657            0 :       q1 = sgn(q0)
    1658            0 :       q2 = -0.5_dp + 0.5_dp*q1
    1659            0 :       q3(1:33) = 0.5_dp*x%d1val1_d1Array(1:33)
    1660            0 :       unary%val = -0.5_dp*x%val + 0.5_dp*z + 0.5_dp*Abs(q0)
    1661            0 :       unary%d1val1 = q2*x%d1val1
    1662            0 :       unary%d1Array(1:33) = q2*x%d1Array(1:33)
    1663            0 :       unary%d1val1_d1Array(1:33) = q1*q3 - q3
    1664            0 :    end function dim_real_self
    1665              : 
    1666            0 :    function dim_self_int(x, y) result(unary)
    1667              :       type(auto_diff_real_tdc), intent(in) :: x
    1668              :       integer, intent(in) :: y
    1669              :       type(auto_diff_real_tdc) :: unary
    1670            0 :       real(dp) :: y_dp
    1671            0 :       real(dp) :: q3(1:33)
    1672            0 :       real(dp) :: q2
    1673            0 :       real(dp) :: q1
    1674              :       real(dp) :: q0
    1675            0 :       y_dp = y
    1676            0 :       q0 = x%val - y_dp
    1677            0 :       q1 = sgn(q0)
    1678            0 :       q2 = 0.5_dp*q1 + 0.5_dp
    1679            0 :       q3(1:33) = 0.5_dp*x%d1val1_d1Array(1:33)
    1680            0 :       unary%val = -0.5_dp*y_dp + 0.5_dp*x%val + 0.5_dp*Abs(q0)
    1681            0 :       unary%d1val1 = q2*x%d1val1
    1682            0 :       unary%d1Array(1:33) = q2*x%d1Array(1:33)
    1683            0 :       unary%d1val1_d1Array(1:33) = q1*q3 + q3
    1684            0 :    end function dim_self_int
    1685              : 
    1686            0 :    function dim_int_self(z, x) result(unary)
    1687              :       integer, intent(in) :: z
    1688              :       type(auto_diff_real_tdc), intent(in) :: x
    1689              :       type(auto_diff_real_tdc) :: unary
    1690            0 :       real(dp) :: y_dp
    1691            0 :       real(dp) :: q3(1:33)
    1692            0 :       real(dp) :: q2
    1693            0 :       real(dp) :: q1
    1694              :       real(dp) :: q0
    1695            0 :       y_dp = z
    1696            0 :       q0 = x%val - y_dp
    1697            0 :       q1 = sgn(q0)
    1698            0 :       q2 = -0.5_dp + 0.5_dp*q1
    1699            0 :       q3(1:33) = 0.5_dp*x%d1val1_d1Array(1:33)
    1700            0 :       unary%val = -0.5_dp*x%val + 0.5_dp*y_dp + 0.5_dp*Abs(q0)
    1701            0 :       unary%d1val1 = q2*x%d1val1
    1702            0 :       unary%d1Array(1:33) = q2*x%d1Array(1:33)
    1703            0 :       unary%d1val1_d1Array(1:33) = q1*q3 - q3
    1704            0 :    end function dim_int_self
    1705              : 
    1706        32878 :    function differentiate_auto_diff_real_tdc_1(this) result(derivative)
    1707              :       type(auto_diff_real_tdc), intent(in) :: this
    1708              :       type(auto_diff_real_tdc) :: derivative
    1709        32878 :       derivative%val = this%d1val1
    1710        32878 :       derivative%d1val1 = 0.0_dp
    1711      1117852 :       derivative%d1Array = this%d1val1_d1Array
    1712      1117852 :       derivative%d1val1_d1Array = 0.0_dp
    1713        32878 :    end function differentiate_auto_diff_real_tdc_1
    1714              : 
    1715            0 : end module auto_diff_real_tdc_module
        

Generated by: LCOV version 2.0-1