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