LCOV - code coverage report
Current view: top level - auto_diff/private - auto_diff_real_4var_order1_module.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 904 0
Test Date: 2025-05-08 18:23:42 Functions: 0.0 % 120 0

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

Generated by: LCOV version 2.0-1