Line data Source code
1 : ! ***********************************************************************
2 : !
3 : ! Copyright (C) 2022 The MESA Team
4 : !
5 : ! This program is free software: you can redistribute it and/or modify
6 : ! it under the terms of the GNU Lesser General Public License
7 : ! as published by the Free Software Foundation,
8 : ! either version 3 of the License, or (at your option) any later version.
9 : !
10 : ! This program is distributed in the hope that it will be useful,
11 : ! but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 : ! See the GNU Lesser General Public License for more details.
14 : !
15 : ! You should have received a copy of the GNU Lesser General Public License
16 : ! along with this program. If not, see <https://www.gnu.org/licenses/>.
17 : !
18 : ! ***********************************************************************
19 :
20 : module auto_diff_real_2var_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_2var_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 : type :: auto_diff_real_2var_order1
88 : real(dp) :: val
89 : real(dp) :: d1val1
90 : real(dp) :: d1val2
91 : end type auto_diff_real_2var_order1
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_2var_order1_real_dp
102 : module procedure equal_real_dp_auto_diff_real_2var_order1
103 : module procedure equal_auto_diff_real_2var_order1_int
104 : module procedure equal_int_auto_diff_real_2var_order1
105 : end interface operator(.eq.)
106 :
107 : interface operator(.ne.)
108 : module procedure neq_self
109 : module procedure neq_auto_diff_real_2var_order1_real_dp
110 : module procedure neq_real_dp_auto_diff_real_2var_order1
111 : module procedure neq_auto_diff_real_2var_order1_int
112 : module procedure neq_int_auto_diff_real_2var_order1
113 : end interface operator(.ne.)
114 :
115 : interface operator(.gt.)
116 : module procedure greater_self
117 : module procedure greater_auto_diff_real_2var_order1_real_dp
118 : module procedure greater_real_dp_auto_diff_real_2var_order1
119 : module procedure greater_auto_diff_real_2var_order1_int
120 : module procedure greater_int_auto_diff_real_2var_order1
121 : end interface operator(.gt.)
122 :
123 : interface operator(.lt.)
124 : module procedure less_self
125 : module procedure less_auto_diff_real_2var_order1_real_dp
126 : module procedure less_real_dp_auto_diff_real_2var_order1
127 : module procedure less_auto_diff_real_2var_order1_int
128 : module procedure less_int_auto_diff_real_2var_order1
129 : end interface operator(.lt.)
130 :
131 : interface operator(.le.)
132 : module procedure leq_self
133 : module procedure leq_auto_diff_real_2var_order1_real_dp
134 : module procedure leq_real_dp_auto_diff_real_2var_order1
135 : module procedure leq_auto_diff_real_2var_order1_int
136 : module procedure leq_int_auto_diff_real_2var_order1
137 : end interface operator(.le.)
138 :
139 : interface operator(.ge.)
140 : module procedure geq_self
141 : module procedure geq_auto_diff_real_2var_order1_real_dp
142 : module procedure geq_real_dp_auto_diff_real_2var_order1
143 : module procedure geq_auto_diff_real_2var_order1_int
144 : module procedure geq_int_auto_diff_real_2var_order1
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_2var_order1_1
381 : end interface differentiate_1
382 :
383 : interface differentiate_2
384 : module procedure differentiate_auto_diff_real_2var_order1_2
385 : end interface differentiate_2
386 :
387 : contains
388 :
389 24158128 : subroutine assign_from_self(this, other)
390 : type(auto_diff_real_2var_order1), intent(out) :: this
391 : type(auto_diff_real_2var_order1), intent(in) :: other
392 24158128 : this%val = other%val
393 24158128 : this%d1val1 = other%d1val1
394 24158128 : this%d1val2 = other%d1val2
395 24158128 : end subroutine assign_from_self
396 :
397 6816498 : subroutine assign_from_real_dp(this, other)
398 : type(auto_diff_real_2var_order1), intent(out) :: this
399 : real(dp), intent(in) :: other
400 6816498 : this%val = other
401 6816498 : this%d1val1 = 0.0_dp
402 6816498 : this%d1val2 = 0.0_dp
403 6816498 : end subroutine assign_from_real_dp
404 :
405 290685 : subroutine assign_from_int(this, other)
406 : type(auto_diff_real_2var_order1), intent(out) :: this
407 : integer, intent(in) :: other
408 290685 : this%val = other
409 290685 : this%d1val1 = 0.0_dp
410 290685 : this%d1val2 = 0.0_dp
411 290685 : end subroutine assign_from_int
412 :
413 1 : function equal_self(this, other) result(z)
414 : type(auto_diff_real_2var_order1), intent(in) :: this
415 : type(auto_diff_real_2var_order1), intent(in) :: other
416 : logical :: z
417 1 : z = (this%val == other%val)
418 1 : end function equal_self
419 :
420 79995 : function equal_auto_diff_real_2var_order1_real_dp(this, other) result(z)
421 : type(auto_diff_real_2var_order1), intent(in) :: this
422 : real(dp), intent(in) :: other
423 : logical :: z
424 79995 : z = (this%val == other)
425 79995 : end function equal_auto_diff_real_2var_order1_real_dp
426 :
427 0 : function equal_real_dp_auto_diff_real_2var_order1(this, other) result(z)
428 : real(dp), intent(in) :: this
429 : type(auto_diff_real_2var_order1), intent(in) :: other
430 : logical :: z
431 0 : z = (this == other%val)
432 0 : end function equal_real_dp_auto_diff_real_2var_order1
433 :
434 538965 : function equal_auto_diff_real_2var_order1_int(this, other) result(z)
435 : type(auto_diff_real_2var_order1), intent(in) :: this
436 : integer, intent(in) :: other
437 : logical :: z
438 538965 : z = (this%val == other)
439 538965 : end function equal_auto_diff_real_2var_order1_int
440 :
441 0 : function equal_int_auto_diff_real_2var_order1(this, other) result(z)
442 : integer, intent(in) :: this
443 : type(auto_diff_real_2var_order1), intent(in) :: other
444 : logical :: z
445 0 : z = (this == other%val)
446 0 : end function equal_int_auto_diff_real_2var_order1
447 :
448 0 : function neq_self(this, other) result(z)
449 : type(auto_diff_real_2var_order1), intent(in) :: this
450 : type(auto_diff_real_2var_order1), intent(in) :: other
451 : logical :: z
452 0 : z = (this%val /= other%val)
453 0 : end function neq_self
454 :
455 0 : function neq_auto_diff_real_2var_order1_real_dp(this, other) result(z)
456 : type(auto_diff_real_2var_order1), intent(in) :: this
457 : real(dp), intent(in) :: other
458 : logical :: z
459 0 : z = (this%val /= other)
460 0 : end function neq_auto_diff_real_2var_order1_real_dp
461 :
462 0 : function neq_real_dp_auto_diff_real_2var_order1(this, other) result(z)
463 : real(dp), intent(in) :: this
464 : type(auto_diff_real_2var_order1), intent(in) :: other
465 : logical :: z
466 0 : z = (this /= other%val)
467 0 : end function neq_real_dp_auto_diff_real_2var_order1
468 :
469 12 : function neq_auto_diff_real_2var_order1_int(this, other) result(z)
470 : type(auto_diff_real_2var_order1), intent(in) :: this
471 : integer, intent(in) :: other
472 : logical :: z
473 12 : z = (this%val /= other)
474 12 : end function neq_auto_diff_real_2var_order1_int
475 :
476 0 : function neq_int_auto_diff_real_2var_order1(this, other) result(z)
477 : integer, intent(in) :: this
478 : type(auto_diff_real_2var_order1), intent(in) :: other
479 : logical :: z
480 0 : z = (this /= other%val)
481 0 : end function neq_int_auto_diff_real_2var_order1
482 :
483 9 : function greater_self(this, other) result(z)
484 : type(auto_diff_real_2var_order1), intent(in) :: this
485 : type(auto_diff_real_2var_order1), intent(in) :: other
486 : logical :: z
487 9 : z = (this%val > other%val)
488 9 : end function greater_self
489 :
490 1755439 : function greater_auto_diff_real_2var_order1_real_dp(this, other) result(z)
491 : type(auto_diff_real_2var_order1), intent(in) :: this
492 : real(dp), intent(in) :: other
493 : logical :: z
494 1755439 : z = (this%val > other)
495 1755439 : end function greater_auto_diff_real_2var_order1_real_dp
496 :
497 0 : function greater_real_dp_auto_diff_real_2var_order1(this, other) result(z)
498 : real(dp), intent(in) :: this
499 : type(auto_diff_real_2var_order1), intent(in) :: other
500 : logical :: z
501 0 : z = (this > other%val)
502 0 : end function greater_real_dp_auto_diff_real_2var_order1
503 :
504 86249 : function greater_auto_diff_real_2var_order1_int(this, other) result(z)
505 : type(auto_diff_real_2var_order1), intent(in) :: this
506 : integer, intent(in) :: other
507 : logical :: z
508 86249 : z = (this%val > other)
509 86249 : end function greater_auto_diff_real_2var_order1_int
510 :
511 0 : function greater_int_auto_diff_real_2var_order1(this, other) result(z)
512 : integer, intent(in) :: this
513 : type(auto_diff_real_2var_order1), intent(in) :: other
514 : logical :: z
515 0 : z = (this > other%val)
516 0 : end function greater_int_auto_diff_real_2var_order1
517 :
518 13 : function less_self(this, other) result(z)
519 : type(auto_diff_real_2var_order1), intent(in) :: this
520 : type(auto_diff_real_2var_order1), intent(in) :: other
521 : logical :: z
522 13 : z = (this%val < other%val)
523 13 : end function less_self
524 :
525 4506916 : function less_auto_diff_real_2var_order1_real_dp(this, other) result(z)
526 : type(auto_diff_real_2var_order1), intent(in) :: this
527 : real(dp), intent(in) :: other
528 : logical :: z
529 4506916 : z = (this%val < other)
530 4506916 : end function less_auto_diff_real_2var_order1_real_dp
531 :
532 0 : function less_real_dp_auto_diff_real_2var_order1(this, other) result(z)
533 : real(dp), intent(in) :: this
534 : type(auto_diff_real_2var_order1), intent(in) :: other
535 : logical :: z
536 0 : z = (this < other%val)
537 0 : end function less_real_dp_auto_diff_real_2var_order1
538 :
539 86217 : function less_auto_diff_real_2var_order1_int(this, other) result(z)
540 : type(auto_diff_real_2var_order1), intent(in) :: this
541 : integer, intent(in) :: other
542 : logical :: z
543 86217 : z = (this%val < other)
544 86217 : end function less_auto_diff_real_2var_order1_int
545 :
546 0 : function less_int_auto_diff_real_2var_order1(this, other) result(z)
547 : integer, intent(in) :: this
548 : type(auto_diff_real_2var_order1), intent(in) :: other
549 : logical :: z
550 0 : z = (this < other%val)
551 0 : end function less_int_auto_diff_real_2var_order1
552 :
553 2 : function leq_self(this, other) result(z)
554 : type(auto_diff_real_2var_order1), intent(in) :: this
555 : type(auto_diff_real_2var_order1), intent(in) :: other
556 : logical :: z
557 2 : z = (this%val <= other%val)
558 2 : end function leq_self
559 :
560 172434 : function leq_auto_diff_real_2var_order1_real_dp(this, other) result(z)
561 : type(auto_diff_real_2var_order1), intent(in) :: this
562 : real(dp), intent(in) :: other
563 : logical :: z
564 172434 : z = (this%val <= other)
565 172434 : end function leq_auto_diff_real_2var_order1_real_dp
566 :
567 0 : function leq_real_dp_auto_diff_real_2var_order1(this, other) result(z)
568 : real(dp), intent(in) :: this
569 : type(auto_diff_real_2var_order1), intent(in) :: other
570 : logical :: z
571 0 : z = (this <= other%val)
572 0 : end function leq_real_dp_auto_diff_real_2var_order1
573 :
574 2 : function leq_auto_diff_real_2var_order1_int(this, other) result(z)
575 : type(auto_diff_real_2var_order1), intent(in) :: this
576 : integer, intent(in) :: other
577 : logical :: z
578 2 : z = (this%val <= other)
579 2 : end function leq_auto_diff_real_2var_order1_int
580 :
581 0 : function leq_int_auto_diff_real_2var_order1(this, other) result(z)
582 : integer, intent(in) :: this
583 : type(auto_diff_real_2var_order1), intent(in) :: other
584 : logical :: z
585 0 : z = (this <= other%val)
586 0 : end function leq_int_auto_diff_real_2var_order1
587 :
588 2 : function geq_self(this, other) result(z)
589 : type(auto_diff_real_2var_order1), intent(in) :: this
590 : type(auto_diff_real_2var_order1), intent(in) :: other
591 : logical :: z
592 2 : z = (this%val >= other%val)
593 2 : end function geq_self
594 :
595 86218 : function geq_auto_diff_real_2var_order1_real_dp(this, other) result(z)
596 : type(auto_diff_real_2var_order1), intent(in) :: this
597 : real(dp), intent(in) :: other
598 : logical :: z
599 86218 : z = (this%val >= other)
600 86218 : end function geq_auto_diff_real_2var_order1_real_dp
601 :
602 0 : function geq_real_dp_auto_diff_real_2var_order1(this, other) result(z)
603 : real(dp), intent(in) :: this
604 : type(auto_diff_real_2var_order1), intent(in) :: other
605 : logical :: z
606 0 : z = (this >= other%val)
607 0 : end function geq_real_dp_auto_diff_real_2var_order1
608 :
609 2 : function geq_auto_diff_real_2var_order1_int(this, other) result(z)
610 : type(auto_diff_real_2var_order1), intent(in) :: this
611 : integer, intent(in) :: other
612 : logical :: z
613 2 : z = (this%val >= other)
614 2 : end function geq_auto_diff_real_2var_order1_int
615 :
616 0 : function geq_int_auto_diff_real_2var_order1(this, other) result(z)
617 : integer, intent(in) :: this
618 : type(auto_diff_real_2var_order1), intent(in) :: other
619 : logical :: z
620 0 : z = (this >= other%val)
621 0 : end function geq_int_auto_diff_real_2var_order1
622 :
623 0 : function make_unary_operator(x, z_val, z_d1x) result(unary)
624 : type(auto_diff_real_2var_order1), intent(in) :: x
625 : real(dp), intent(in) :: z_val
626 : real(dp), intent(in) :: z_d1x
627 : type(auto_diff_real_2var_order1) :: unary
628 0 : unary%val = z_val
629 0 : unary%d1val1 = x%d1val1*z_d1x
630 0 : unary%d1val2 = x%d1val2*z_d1x
631 0 : end function make_unary_operator
632 :
633 0 : function make_binary_operator(x, y, z_val, z_d1x, z_d1y) result(binary)
634 : type(auto_diff_real_2var_order1), intent(in) :: x
635 : type(auto_diff_real_2var_order1), intent(in) :: y
636 : real(dp), intent(in) :: z_val
637 : real(dp), intent(in) :: z_d1x
638 : real(dp), intent(in) :: z_d1y
639 : type(auto_diff_real_2var_order1) :: binary
640 0 : binary%val = z_val
641 0 : binary%d1val1 = x%d1val1*z_d1x + y%d1val1*z_d1y
642 0 : binary%d1val2 = x%d1val2*z_d1x + y%d1val2*z_d1y
643 0 : end function make_binary_operator
644 :
645 0 : function sign_self(x) result(unary)
646 : type(auto_diff_real_2var_order1), intent(in) :: x
647 : type(auto_diff_real_2var_order1) :: unary
648 0 : unary%val = sgn(x%val)
649 0 : unary%d1val1 = 0.0_dp
650 0 : unary%d1val2 = 0.0_dp
651 0 : end function sign_self
652 :
653 0 : function safe_sqrt_self(x) result(unary)
654 : type(auto_diff_real_2var_order1), intent(in) :: x
655 : type(auto_diff_real_2var_order1) :: unary
656 0 : real(dp) :: q1
657 0 : real(dp) :: q0
658 0 : q0 = sqrt(x%val*Heaviside(x%val))
659 0 : q1 = 0.5_dp*q0*powm1(x%val)
660 0 : unary%val = q0
661 0 : unary%d1val1 = q1*x%d1val1
662 0 : unary%d1val2 = q1*x%d1val2
663 0 : end function safe_sqrt_self
664 :
665 547964 : function unary_minus_self(x) result(unary)
666 : type(auto_diff_real_2var_order1), intent(in) :: x
667 : type(auto_diff_real_2var_order1) :: unary
668 547964 : unary%val = -x%val
669 547964 : unary%d1val1 = -x%d1val1
670 547964 : unary%d1val2 = -x%d1val2
671 547964 : end function unary_minus_self
672 :
673 172465 : function exp_self(x) result(unary)
674 : type(auto_diff_real_2var_order1), intent(in) :: x
675 : type(auto_diff_real_2var_order1) :: unary
676 172465 : real(dp) :: q0
677 172465 : q0 = exp(x%val)
678 172465 : unary%val = q0
679 172465 : unary%d1val1 = q0*x%d1val1
680 172465 : unary%d1val2 = q0*x%d1val2
681 172465 : end function exp_self
682 :
683 0 : function expm1_self(x) result(unary)
684 : type(auto_diff_real_2var_order1), intent(in) :: x
685 : type(auto_diff_real_2var_order1) :: unary
686 0 : real(dp) :: q0
687 0 : q0 = exp(x%val)
688 0 : unary%val = expm1(x%val)
689 0 : unary%d1val1 = q0*x%d1val1
690 0 : unary%d1val2 = q0*x%d1val2
691 0 : end function expm1_self
692 :
693 0 : function exp10_self(x) result(unary)
694 : type(auto_diff_real_2var_order1), intent(in) :: x
695 : type(auto_diff_real_2var_order1) :: unary
696 0 : real(dp) :: q1
697 0 : real(dp) :: q0
698 0 : q0 = pow(10.0_dp, x%val)
699 0 : q1 = q0*ln10
700 0 : unary%val = q0
701 0 : unary%d1val1 = q1*x%d1val1
702 0 : unary%d1val2 = q1*x%d1val2
703 0 : end function exp10_self
704 :
705 0 : function powm1_self(x) result(unary)
706 : type(auto_diff_real_2var_order1), intent(in) :: x
707 : type(auto_diff_real_2var_order1) :: unary
708 0 : real(dp) :: q0
709 0 : q0 = powm1(pow2(x%val))
710 0 : unary%val = powm1(x%val)
711 0 : unary%d1val1 = -q0*x%d1val1
712 0 : unary%d1val2 = -q0*x%d1val2
713 0 : end function powm1_self
714 :
715 172446 : function log_self(x) result(unary)
716 : type(auto_diff_real_2var_order1), intent(in) :: x
717 : type(auto_diff_real_2var_order1) :: unary
718 172446 : real(dp) :: q0
719 172446 : q0 = powm1(x%val)
720 172446 : unary%val = log(x%val)
721 172446 : unary%d1val1 = q0*x%d1val1
722 172446 : unary%d1val2 = q0*x%d1val2
723 172446 : end function log_self
724 :
725 0 : function log1p_self(x) result(unary)
726 : type(auto_diff_real_2var_order1), intent(in) :: x
727 : type(auto_diff_real_2var_order1) :: unary
728 0 : real(dp) :: q0
729 0 : q0 = powm1(x%val + 1)
730 0 : unary%val = log1p(x%val)
731 0 : unary%d1val1 = q0*x%d1val1
732 0 : unary%d1val2 = q0*x%d1val2
733 0 : end function log1p_self
734 :
735 0 : function safe_log_self(x) result(unary)
736 : type(auto_diff_real_2var_order1), intent(in) :: x
737 : type(auto_diff_real_2var_order1) :: unary
738 0 : real(dp) :: q0
739 0 : q0 = powm1(x%val)
740 0 : unary%val = safe_log(x%val)
741 0 : unary%d1val1 = q0*x%d1val1
742 0 : unary%d1val2 = q0*x%d1val2
743 0 : end function safe_log_self
744 :
745 9 : function log10_self(x) result(unary)
746 : type(auto_diff_real_2var_order1), intent(in) :: x
747 : type(auto_diff_real_2var_order1) :: unary
748 9 : real(dp) :: q1
749 9 : real(dp) :: q0
750 9 : q0 = powm1(ln10)
751 9 : q1 = q0*powm1(x%val)
752 9 : unary%val = q0*log(x%val)
753 9 : unary%d1val1 = q1*x%d1val1
754 9 : unary%d1val2 = q1*x%d1val2
755 9 : end function log10_self
756 :
757 1 : function safe_log10_self(x) result(unary)
758 : type(auto_diff_real_2var_order1), intent(in) :: x
759 : type(auto_diff_real_2var_order1) :: unary
760 1 : real(dp) :: q1
761 1 : real(dp) :: q0
762 1 : q0 = powm1(ln10)
763 1 : q1 = q0*powm1(x%val)
764 1 : unary%val = q0*safe_log(x%val)
765 1 : unary%d1val1 = q1*x%d1val1
766 1 : unary%d1val2 = q1*x%d1val2
767 1 : end function safe_log10_self
768 :
769 0 : function log2_self(x) result(unary)
770 : type(auto_diff_real_2var_order1), intent(in) :: x
771 : type(auto_diff_real_2var_order1) :: unary
772 0 : real(dp) :: q1
773 0 : real(dp) :: q0
774 0 : q0 = powm1(log(2.0_dp))
775 0 : q1 = q0*powm1(x%val)
776 0 : unary%val = q0*log(x%val)
777 0 : unary%d1val1 = q1*x%d1val1
778 0 : unary%d1val2 = q1*x%d1val2
779 0 : end function log2_self
780 :
781 1 : function sin_self(x) result(unary)
782 : type(auto_diff_real_2var_order1), intent(in) :: x
783 : type(auto_diff_real_2var_order1) :: unary
784 1 : real(dp) :: q0
785 1 : q0 = cos(x%val)
786 1 : unary%val = sin(x%val)
787 1 : unary%d1val1 = q0*x%d1val1
788 1 : unary%d1val2 = q0*x%d1val2
789 1 : end function sin_self
790 :
791 1 : function cos_self(x) result(unary)
792 : type(auto_diff_real_2var_order1), intent(in) :: x
793 : type(auto_diff_real_2var_order1) :: unary
794 1 : real(dp) :: q0
795 1 : q0 = sin(x%val)
796 1 : unary%val = cos(x%val)
797 1 : unary%d1val1 = -q0*x%d1val1
798 1 : unary%d1val2 = -q0*x%d1val2
799 1 : end function cos_self
800 :
801 1 : function tan_self(x) result(unary)
802 : type(auto_diff_real_2var_order1), intent(in) :: x
803 : type(auto_diff_real_2var_order1) :: unary
804 1 : real(dp) :: q1
805 : real(dp) :: q0
806 1 : q0 = tan(x%val)
807 1 : q1 = pow2(q0) + 1
808 1 : unary%val = q0
809 1 : unary%d1val1 = q1*x%d1val1
810 1 : unary%d1val2 = q1*x%d1val2
811 1 : end function tan_self
812 :
813 0 : function sinpi_self(x) result(unary)
814 : type(auto_diff_real_2var_order1), intent(in) :: x
815 : type(auto_diff_real_2var_order1) :: unary
816 0 : real(dp) :: q1
817 : real(dp) :: q0
818 0 : q0 = pi*x%val
819 0 : q1 = pi*cos(q0)
820 0 : unary%val = sin(q0)
821 0 : unary%d1val1 = q1*x%d1val1
822 0 : unary%d1val2 = q1*x%d1val2
823 0 : end function sinpi_self
824 :
825 0 : function cospi_self(x) result(unary)
826 : type(auto_diff_real_2var_order1), intent(in) :: x
827 : type(auto_diff_real_2var_order1) :: unary
828 0 : real(dp) :: q1
829 : real(dp) :: q0
830 0 : q0 = pi*x%val
831 0 : q1 = pi*sin(q0)
832 0 : unary%val = cos(q0)
833 0 : unary%d1val1 = -q1*x%d1val1
834 0 : unary%d1val2 = -q1*x%d1val2
835 0 : end function cospi_self
836 :
837 0 : function tanpi_self(x) result(unary)
838 : type(auto_diff_real_2var_order1), intent(in) :: x
839 : type(auto_diff_real_2var_order1) :: unary
840 0 : real(dp) :: q1
841 : real(dp) :: q0
842 0 : q0 = tan(pi*x%val)
843 0 : q1 = pi*(pow2(q0) + 1)
844 0 : unary%val = q0
845 0 : unary%d1val1 = q1*x%d1val1
846 0 : unary%d1val2 = q1*x%d1val2
847 0 : end function tanpi_self
848 :
849 1 : function sinh_self(x) result(unary)
850 : type(auto_diff_real_2var_order1), intent(in) :: x
851 : type(auto_diff_real_2var_order1) :: unary
852 1 : real(dp) :: q0
853 1 : q0 = cosh(x%val)
854 1 : unary%val = sinh(x%val)
855 1 : unary%d1val1 = q0*x%d1val1
856 1 : unary%d1val2 = q0*x%d1val2
857 1 : end function sinh_self
858 :
859 1 : function cosh_self(x) result(unary)
860 : type(auto_diff_real_2var_order1), intent(in) :: x
861 : type(auto_diff_real_2var_order1) :: unary
862 1 : real(dp) :: q0
863 1 : q0 = sinh(x%val)
864 1 : unary%val = cosh(x%val)
865 1 : unary%d1val1 = q0*x%d1val1
866 1 : unary%d1val2 = q0*x%d1val2
867 1 : end function cosh_self
868 :
869 172431 : function tanh_self(x) result(unary)
870 : type(auto_diff_real_2var_order1), intent(in) :: x
871 : type(auto_diff_real_2var_order1) :: unary
872 172431 : real(dp) :: q1
873 : real(dp) :: q0
874 172431 : q0 = tanh(x%val)
875 172431 : q1 = pow2(q0) - 1
876 172431 : unary%val = q0
877 172431 : unary%d1val1 = -q1*x%d1val1
878 172431 : unary%d1val2 = -q1*x%d1val2
879 172431 : end function tanh_self
880 :
881 1 : function asin_self(x) result(unary)
882 : type(auto_diff_real_2var_order1), intent(in) :: x
883 : type(auto_diff_real_2var_order1) :: unary
884 1 : real(dp) :: q0
885 1 : q0 = powm1(sqrt(1 - pow2(x%val)))
886 1 : unary%val = asin(x%val)
887 1 : unary%d1val1 = q0*x%d1val1
888 1 : unary%d1val2 = q0*x%d1val2
889 1 : end function asin_self
890 :
891 1 : function acos_self(x) result(unary)
892 : type(auto_diff_real_2var_order1), intent(in) :: x
893 : type(auto_diff_real_2var_order1) :: unary
894 1 : real(dp) :: q0
895 1 : q0 = powm1(sqrt(1 - pow2(x%val)))
896 1 : unary%val = acos(x%val)
897 1 : unary%d1val1 = -q0*x%d1val1
898 1 : unary%d1val2 = -q0*x%d1val2
899 1 : end function acos_self
900 :
901 13 : function atan_self(x) result(unary)
902 : type(auto_diff_real_2var_order1), intent(in) :: x
903 : type(auto_diff_real_2var_order1) :: unary
904 13 : real(dp) :: q0
905 13 : q0 = powm1(pow2(x%val) + 1)
906 13 : unary%val = atan(x%val)
907 13 : unary%d1val1 = q0*x%d1val1
908 13 : unary%d1val2 = q0*x%d1val2
909 13 : end function atan_self
910 :
911 0 : function asinpi_self(x) result(unary)
912 : type(auto_diff_real_2var_order1), intent(in) :: x
913 : type(auto_diff_real_2var_order1) :: unary
914 0 : real(dp) :: q1
915 0 : real(dp) :: q0
916 0 : q0 = powm1(pi)
917 0 : q1 = q0*powm1(sqrt(1 - pow2(x%val)))
918 0 : unary%val = q0*asin(x%val)
919 0 : unary%d1val1 = q1*x%d1val1
920 0 : unary%d1val2 = q1*x%d1val2
921 0 : end function asinpi_self
922 :
923 0 : function acospi_self(x) result(unary)
924 : type(auto_diff_real_2var_order1), intent(in) :: x
925 : type(auto_diff_real_2var_order1) :: unary
926 0 : real(dp) :: q1
927 0 : real(dp) :: q0
928 0 : q0 = powm1(pi)
929 0 : q1 = q0*powm1(sqrt(1 - pow2(x%val)))
930 0 : unary%val = q0*acos(x%val)
931 0 : unary%d1val1 = -q1*x%d1val1
932 0 : unary%d1val2 = -q1*x%d1val2
933 0 : end function acospi_self
934 :
935 0 : function atanpi_self(x) result(unary)
936 : type(auto_diff_real_2var_order1), intent(in) :: x
937 : type(auto_diff_real_2var_order1) :: unary
938 0 : real(dp) :: q0
939 0 : q0 = powm1(pi*pow2(x%val) + pi)
940 0 : unary%val = powm1(pi)*atan(x%val)
941 0 : unary%d1val1 = q0*x%d1val1
942 0 : unary%d1val2 = q0*x%d1val2
943 0 : end function atanpi_self
944 :
945 1 : function asinh_self(x) result(unary)
946 : type(auto_diff_real_2var_order1), intent(in) :: x
947 : type(auto_diff_real_2var_order1) :: unary
948 1 : real(dp) :: q0
949 1 : q0 = powm1(sqrt(pow2(x%val) + 1))
950 1 : unary%val = asinh(x%val)
951 1 : unary%d1val1 = q0*x%d1val1
952 1 : unary%d1val2 = q0*x%d1val2
953 1 : end function asinh_self
954 :
955 1 : function acosh_self(x) result(unary)
956 : type(auto_diff_real_2var_order1), intent(in) :: x
957 : type(auto_diff_real_2var_order1) :: unary
958 1 : real(dp) :: q0
959 1 : q0 = powm1(sqrt(pow2(x%val) - 1))
960 1 : unary%val = acosh(x%val)
961 1 : unary%d1val1 = q0*x%d1val1
962 1 : unary%d1val2 = q0*x%d1val2
963 1 : end function acosh_self
964 :
965 1 : function atanh_self(x) result(unary)
966 : type(auto_diff_real_2var_order1), intent(in) :: x
967 : type(auto_diff_real_2var_order1) :: unary
968 1 : real(dp) :: q0
969 1 : q0 = powm1(pow2(x%val) - 1)
970 1 : unary%val = atanh(x%val)
971 1 : unary%d1val1 = -q0*x%d1val1
972 1 : unary%d1val2 = -q0*x%d1val2
973 1 : end function atanh_self
974 :
975 1930156 : function sqrt_self(x) result(unary)
976 : type(auto_diff_real_2var_order1), intent(in) :: x
977 : type(auto_diff_real_2var_order1) :: unary
978 1930156 : real(dp) :: q1
979 : real(dp) :: q0
980 1930156 : q0 = sqrt(x%val)
981 1930156 : q1 = 0.5_dp*powm1(q0)
982 1930156 : unary%val = q0
983 1930156 : unary%d1val1 = q1*x%d1val1
984 1930156 : unary%d1val2 = q1*x%d1val2
985 1930156 : end function sqrt_self
986 :
987 8065005 : function pow2_self(x) result(unary)
988 : type(auto_diff_real_2var_order1), intent(in) :: x
989 : type(auto_diff_real_2var_order1) :: unary
990 8065005 : real(dp) :: q0
991 8065005 : q0 = 2.0_dp*x%val
992 8065005 : unary%val = pow2(x%val)
993 8065005 : unary%d1val1 = q0*x%d1val1
994 8065005 : unary%d1val2 = q0*x%d1val2
995 8065005 : end function pow2_self
996 :
997 9 : function pow3_self(x) result(unary)
998 : type(auto_diff_real_2var_order1), intent(in) :: x
999 : type(auto_diff_real_2var_order1) :: unary
1000 9 : real(dp) :: q0
1001 9 : q0 = 3.0_dp*pow2(x%val)
1002 9 : unary%val = pow3(x%val)
1003 9 : unary%d1val1 = q0*x%d1val1
1004 9 : unary%d1val2 = q0*x%d1val2
1005 9 : end function pow3_self
1006 :
1007 1 : function pow4_self(x) result(unary)
1008 : type(auto_diff_real_2var_order1), intent(in) :: x
1009 : type(auto_diff_real_2var_order1) :: unary
1010 1 : real(dp) :: q0
1011 1 : q0 = 4.0_dp*pow3(x%val)
1012 1 : unary%val = pow4(x%val)
1013 1 : unary%d1val1 = q0*x%d1val1
1014 1 : unary%d1val2 = q0*x%d1val2
1015 1 : end function pow4_self
1016 :
1017 17 : function pow5_self(x) result(unary)
1018 : type(auto_diff_real_2var_order1), intent(in) :: x
1019 : type(auto_diff_real_2var_order1) :: unary
1020 17 : real(dp) :: q0
1021 17 : q0 = 5.0_dp*pow4(x%val)
1022 17 : unary%val = pow5(x%val)
1023 17 : unary%d1val1 = q0*x%d1val1
1024 17 : unary%d1val2 = q0*x%d1val2
1025 17 : end function pow5_self
1026 :
1027 17 : function pow6_self(x) result(unary)
1028 : type(auto_diff_real_2var_order1), intent(in) :: x
1029 : type(auto_diff_real_2var_order1) :: unary
1030 17 : real(dp) :: q0
1031 17 : q0 = 6.0_dp*pow5(x%val)
1032 17 : unary%val = pow6(x%val)
1033 17 : unary%d1val1 = q0*x%d1val1
1034 17 : unary%d1val2 = q0*x%d1val2
1035 17 : end function pow6_self
1036 :
1037 1 : function pow7_self(x) result(unary)
1038 : type(auto_diff_real_2var_order1), intent(in) :: x
1039 : type(auto_diff_real_2var_order1) :: unary
1040 1 : real(dp) :: q0
1041 1 : q0 = 7.0_dp*pow6(x%val)
1042 1 : unary%val = pow7(x%val)
1043 1 : unary%d1val1 = q0*x%d1val1
1044 1 : unary%d1val2 = q0*x%d1val2
1045 1 : end function pow7_self
1046 :
1047 0 : function pow8_self(x) result(unary)
1048 : type(auto_diff_real_2var_order1), intent(in) :: x
1049 : type(auto_diff_real_2var_order1) :: unary
1050 0 : real(dp) :: q0
1051 0 : q0 = 8.0_dp*pow7(x%val)
1052 0 : unary%val = pow8(x%val)
1053 0 : unary%d1val1 = q0*x%d1val1
1054 0 : unary%d1val2 = q0*x%d1val2
1055 0 : end function pow8_self
1056 :
1057 2 : function abs_self(x) result(unary)
1058 : type(auto_diff_real_2var_order1), intent(in) :: x
1059 : type(auto_diff_real_2var_order1) :: unary
1060 2 : real(dp) :: q0
1061 2 : q0 = sgn(x%val)
1062 2 : unary%val = Abs(x%val)
1063 2 : unary%d1val1 = q0*x%d1val1
1064 2 : unary%d1val2 = q0*x%d1val2
1065 2 : end function abs_self
1066 :
1067 6135369 : function add_self(x, y) result(binary)
1068 : type(auto_diff_real_2var_order1), intent(in) :: x
1069 : type(auto_diff_real_2var_order1), intent(in) :: y
1070 : type(auto_diff_real_2var_order1) :: binary
1071 6135369 : binary%val = x%val + y%val
1072 6135369 : binary%d1val1 = x%d1val1 + y%d1val1
1073 6135369 : binary%d1val2 = x%d1val2 + y%d1val2
1074 6135369 : end function add_self
1075 :
1076 1398000 : function add_self_real(x, y) result(unary)
1077 : type(auto_diff_real_2var_order1), intent(in) :: x
1078 : real(dp), intent(in) :: y
1079 : type(auto_diff_real_2var_order1) :: unary
1080 1398000 : unary%val = x%val + y
1081 1398000 : unary%d1val1 = x%d1val1
1082 1398000 : unary%d1val2 = x%d1val2
1083 1398000 : end function add_self_real
1084 :
1085 2202293 : function add_real_self(z, x) result(unary)
1086 : real(dp), intent(in) :: z
1087 : type(auto_diff_real_2var_order1), intent(in) :: x
1088 : type(auto_diff_real_2var_order1) :: unary
1089 2202293 : unary%val = x%val + z
1090 2202293 : unary%d1val1 = x%d1val1
1091 2202293 : unary%d1val2 = x%d1val2
1092 2202293 : end function add_real_self
1093 :
1094 1 : function add_self_int(x, y) result(unary)
1095 : type(auto_diff_real_2var_order1), intent(in) :: x
1096 : integer, intent(in) :: y
1097 : type(auto_diff_real_2var_order1) :: unary
1098 1 : real(dp) :: y_dp
1099 1 : y_dp = y
1100 1 : unary%val = x%val + y_dp
1101 1 : unary%d1val1 = x%d1val1
1102 1 : unary%d1val2 = x%d1val2
1103 1 : end function add_self_int
1104 :
1105 61 : function add_int_self(z, x) result(unary)
1106 : integer, intent(in) :: z
1107 : type(auto_diff_real_2var_order1), intent(in) :: x
1108 : type(auto_diff_real_2var_order1) :: unary
1109 61 : real(dp) :: y_dp
1110 61 : y_dp = z
1111 61 : unary%val = x%val + y_dp
1112 61 : unary%d1val1 = x%d1val1
1113 61 : unary%d1val2 = x%d1val2
1114 61 : end function add_int_self
1115 :
1116 2499226 : function sub_self(x, y) result(binary)
1117 : type(auto_diff_real_2var_order1), intent(in) :: x
1118 : type(auto_diff_real_2var_order1), intent(in) :: y
1119 : type(auto_diff_real_2var_order1) :: binary
1120 2499226 : binary%val = x%val - y%val
1121 2499226 : binary%d1val1 = x%d1val1 - y%d1val1
1122 2499226 : binary%d1val2 = x%d1val2 - y%d1val2
1123 2499226 : end function sub_self
1124 :
1125 8255144 : function sub_self_real(x, y) result(unary)
1126 : type(auto_diff_real_2var_order1), intent(in) :: x
1127 : real(dp), intent(in) :: y
1128 : type(auto_diff_real_2var_order1) :: unary
1129 8255144 : unary%val = x%val - y
1130 8255144 : unary%d1val1 = x%d1val1
1131 8255144 : unary%d1val2 = x%d1val2
1132 8255144 : end function sub_self_real
1133 :
1134 517304 : function sub_real_self(z, x) result(unary)
1135 : real(dp), intent(in) :: z
1136 : type(auto_diff_real_2var_order1), intent(in) :: x
1137 : type(auto_diff_real_2var_order1) :: unary
1138 517304 : unary%val = -x%val + z
1139 517304 : unary%d1val1 = -x%d1val1
1140 517304 : unary%d1val2 = -x%d1val2
1141 517304 : end function sub_real_self
1142 :
1143 0 : function sub_self_int(x, y) result(unary)
1144 : type(auto_diff_real_2var_order1), intent(in) :: x
1145 : integer, intent(in) :: y
1146 : type(auto_diff_real_2var_order1) :: unary
1147 0 : real(dp) :: y_dp
1148 0 : y_dp = y
1149 0 : unary%val = x%val - y_dp
1150 0 : unary%d1val1 = x%d1val1
1151 0 : unary%d1val2 = x%d1val2
1152 0 : end function sub_self_int
1153 :
1154 0 : function sub_int_self(z, x) result(unary)
1155 : integer, intent(in) :: z
1156 : type(auto_diff_real_2var_order1), intent(in) :: x
1157 : type(auto_diff_real_2var_order1) :: unary
1158 0 : real(dp) :: y_dp
1159 0 : y_dp = z
1160 0 : unary%val = -x%val + y_dp
1161 0 : unary%d1val1 = -x%d1val1
1162 0 : unary%d1val2 = -x%d1val2
1163 0 : end function sub_int_self
1164 :
1165 7470771 : function mul_self(x, y) result(binary)
1166 : type(auto_diff_real_2var_order1), intent(in) :: x
1167 : type(auto_diff_real_2var_order1), intent(in) :: y
1168 : type(auto_diff_real_2var_order1) :: binary
1169 7470771 : binary%val = x%val*y%val
1170 7470771 : binary%d1val1 = x%d1val1*y%val + x%val*y%d1val1
1171 7470771 : binary%d1val2 = x%d1val2*y%val + x%val*y%d1val2
1172 7470771 : end function mul_self
1173 :
1174 689809 : function mul_self_real(x, y) result(unary)
1175 : type(auto_diff_real_2var_order1), intent(in) :: x
1176 : real(dp), intent(in) :: y
1177 : type(auto_diff_real_2var_order1) :: unary
1178 689809 : unary%val = x%val*y
1179 689809 : unary%d1val1 = x%d1val1*y
1180 689809 : unary%d1val2 = x%d1val2*y
1181 689809 : end function mul_self_real
1182 :
1183 1515897 : function mul_real_self(z, x) result(unary)
1184 : real(dp), intent(in) :: z
1185 : type(auto_diff_real_2var_order1), intent(in) :: x
1186 : type(auto_diff_real_2var_order1) :: unary
1187 1515897 : unary%val = x%val*z
1188 1515897 : unary%d1val1 = x%d1val1*z
1189 1515897 : unary%d1val2 = x%d1val2*z
1190 1515897 : end function mul_real_self
1191 :
1192 0 : function mul_self_int(x, y) result(unary)
1193 : type(auto_diff_real_2var_order1), intent(in) :: x
1194 : integer, intent(in) :: y
1195 : type(auto_diff_real_2var_order1) :: unary
1196 0 : real(dp) :: y_dp
1197 0 : y_dp = y
1198 0 : unary%val = x%val*y_dp
1199 0 : unary%d1val1 = x%d1val1*y_dp
1200 0 : unary%d1val2 = x%d1val2*y_dp
1201 0 : end function mul_self_int
1202 :
1203 16 : function mul_int_self(z, x) result(unary)
1204 : integer, intent(in) :: z
1205 : type(auto_diff_real_2var_order1), intent(in) :: x
1206 : type(auto_diff_real_2var_order1) :: unary
1207 16 : real(dp) :: y_dp
1208 16 : y_dp = z
1209 16 : unary%val = x%val*y_dp
1210 16 : unary%d1val1 = x%d1val1*y_dp
1211 16 : unary%d1val2 = x%d1val2*y_dp
1212 16 : end function mul_int_self
1213 :
1214 2019293 : function div_self(x, y) result(binary)
1215 : type(auto_diff_real_2var_order1), intent(in) :: x
1216 : type(auto_diff_real_2var_order1), intent(in) :: y
1217 : type(auto_diff_real_2var_order1) :: binary
1218 2019293 : real(dp) :: q0
1219 2019293 : q0 = powm1(pow2(y%val))
1220 2019293 : binary%val = x%val*powm1(y%val)
1221 2019293 : binary%d1val1 = q0*(x%d1val1*y%val - x%val*y%d1val1)
1222 2019293 : binary%d1val2 = q0*(x%d1val2*y%val - x%val*y%d1val2)
1223 2019293 : end function div_self
1224 :
1225 603848 : function div_self_real(x, y) result(unary)
1226 : type(auto_diff_real_2var_order1), intent(in) :: x
1227 : real(dp), intent(in) :: y
1228 : type(auto_diff_real_2var_order1) :: unary
1229 603848 : real(dp) :: q0
1230 603848 : q0 = powm1(y)
1231 603848 : unary%val = q0*x%val
1232 603848 : unary%d1val1 = q0*x%d1val1
1233 603848 : unary%d1val2 = q0*x%d1val2
1234 603848 : end function div_self_real
1235 :
1236 108 : function div_real_self(z, x) result(unary)
1237 : real(dp), intent(in) :: z
1238 : type(auto_diff_real_2var_order1), intent(in) :: x
1239 : type(auto_diff_real_2var_order1) :: unary
1240 108 : real(dp) :: q0
1241 108 : q0 = z*powm1(pow2(x%val))
1242 108 : unary%val = z*powm1(x%val)
1243 108 : unary%d1val1 = -q0*x%d1val1
1244 108 : unary%d1val2 = -q0*x%d1val2
1245 108 : end function div_real_self
1246 :
1247 0 : function div_self_int(x, y) result(unary)
1248 : type(auto_diff_real_2var_order1), intent(in) :: x
1249 : integer, intent(in) :: y
1250 : type(auto_diff_real_2var_order1) :: unary
1251 : real(dp) :: y_dp
1252 0 : real(dp) :: q0
1253 0 : y_dp = y
1254 0 : q0 = powm1(y_dp)
1255 0 : unary%val = q0*x%val
1256 0 : unary%d1val1 = q0*x%d1val1
1257 0 : unary%d1val2 = q0*x%d1val2
1258 0 : end function div_self_int
1259 :
1260 0 : function div_int_self(z, x) result(unary)
1261 : integer, intent(in) :: z
1262 : type(auto_diff_real_2var_order1), intent(in) :: x
1263 : type(auto_diff_real_2var_order1) :: unary
1264 0 : real(dp) :: y_dp
1265 0 : real(dp) :: q0
1266 0 : y_dp = z
1267 0 : q0 = y_dp*powm1(pow2(x%val))
1268 0 : unary%val = y_dp*powm1(x%val)
1269 0 : unary%d1val1 = -q0*x%d1val1
1270 0 : unary%d1val2 = -q0*x%d1val2
1271 0 : end function div_int_self
1272 :
1273 1 : function pow_self(x, y) result(binary)
1274 : type(auto_diff_real_2var_order1), intent(in) :: x
1275 : type(auto_diff_real_2var_order1), intent(in) :: y
1276 : type(auto_diff_real_2var_order1) :: binary
1277 1 : real(dp) :: q1
1278 1 : real(dp) :: q0
1279 1 : q0 = pow(x%val, y%val - 1)
1280 1 : q1 = x%val*log(x%val)
1281 1 : binary%val = pow(x%val, y%val)
1282 1 : binary%d1val1 = q0*(q1*y%d1val1 + x%d1val1*y%val)
1283 1 : binary%d1val2 = q0*(q1*y%d1val2 + x%d1val2*y%val)
1284 1 : end function pow_self
1285 :
1286 178360 : function pow_self_real(x, y) result(unary)
1287 : type(auto_diff_real_2var_order1), intent(in) :: x
1288 : real(dp), intent(in) :: y
1289 : type(auto_diff_real_2var_order1) :: unary
1290 178360 : real(dp) :: q0
1291 178360 : q0 = y*pow(x%val, y - 1)
1292 178360 : unary%val = pow(x%val, y)
1293 178360 : unary%d1val1 = q0*x%d1val1
1294 178360 : unary%d1val2 = q0*x%d1val2
1295 178360 : end function pow_self_real
1296 :
1297 2 : function pow_real_self(z, x) result(unary)
1298 : real(dp), intent(in) :: z
1299 : type(auto_diff_real_2var_order1), intent(in) :: x
1300 : type(auto_diff_real_2var_order1) :: unary
1301 2 : real(dp) :: q1
1302 2 : real(dp) :: q0
1303 2 : q0 = pow(z, x%val)
1304 2 : q1 = q0*log(z)
1305 2 : unary%val = q0
1306 2 : unary%d1val1 = q1*x%d1val1
1307 2 : unary%d1val2 = q1*x%d1val2
1308 2 : end function pow_real_self
1309 :
1310 0 : function pow_self_int(x, y) result(unary)
1311 : type(auto_diff_real_2var_order1), intent(in) :: x
1312 : integer, intent(in) :: y
1313 : type(auto_diff_real_2var_order1) :: unary
1314 : real(dp) :: y_dp
1315 0 : real(dp) :: q0
1316 0 : y_dp = y
1317 0 : q0 = y_dp*pow(x%val, y_dp - 1)
1318 0 : unary%val = pow(x%val, y_dp)
1319 0 : unary%d1val1 = q0*x%d1val1
1320 0 : unary%d1val2 = q0*x%d1val2
1321 0 : end function pow_self_int
1322 :
1323 0 : function pow_int_self(z, x) result(unary)
1324 : integer, intent(in) :: z
1325 : type(auto_diff_real_2var_order1), intent(in) :: x
1326 : type(auto_diff_real_2var_order1) :: unary
1327 : real(dp) :: y_dp
1328 0 : real(dp) :: q1
1329 0 : real(dp) :: q0
1330 0 : y_dp = z
1331 0 : q0 = pow(y_dp, x%val)
1332 0 : q1 = q0*log(y_dp)
1333 0 : unary%val = q0
1334 0 : unary%d1val1 = q1*x%d1val1
1335 0 : unary%d1val2 = q1*x%d1val2
1336 0 : end function pow_int_self
1337 :
1338 11 : function max_self(x, y) result(binary)
1339 : type(auto_diff_real_2var_order1), intent(in) :: x
1340 : type(auto_diff_real_2var_order1), intent(in) :: y
1341 : type(auto_diff_real_2var_order1) :: binary
1342 11 : real(dp) :: q1
1343 11 : real(dp) :: q0
1344 11 : q0 = Heaviside(x%val - y%val)
1345 11 : q1 = Heaviside(-x%val + y%val)
1346 11 : binary%val = Max(x%val, y%val)
1347 11 : binary%d1val1 = q0*x%d1val1 + q1*y%d1val1
1348 11 : binary%d1val2 = q0*x%d1val2 + q1*y%d1val2
1349 11 : end function max_self
1350 :
1351 241254 : function max_self_real(x, y) result(unary)
1352 : type(auto_diff_real_2var_order1), intent(in) :: x
1353 : real(dp), intent(in) :: y
1354 : type(auto_diff_real_2var_order1) :: unary
1355 241254 : real(dp) :: q0
1356 241254 : q0 = Heaviside(x%val - y)
1357 241254 : unary%val = Max(x%val, y)
1358 241254 : unary%d1val1 = q0*x%d1val1
1359 241254 : unary%d1val2 = q0*x%d1val2
1360 241254 : end function max_self_real
1361 :
1362 2 : function max_real_self(z, x) result(unary)
1363 : real(dp), intent(in) :: z
1364 : type(auto_diff_real_2var_order1), intent(in) :: x
1365 : type(auto_diff_real_2var_order1) :: unary
1366 2 : real(dp) :: q0
1367 2 : q0 = Heaviside(x%val - z)
1368 2 : unary%val = Max(x%val, z)
1369 2 : unary%d1val1 = q0*x%d1val1
1370 2 : unary%d1val2 = q0*x%d1val2
1371 2 : end function max_real_self
1372 :
1373 0 : function max_self_int(x, y) result(unary)
1374 : type(auto_diff_real_2var_order1), intent(in) :: x
1375 : integer, intent(in) :: y
1376 : type(auto_diff_real_2var_order1) :: unary
1377 0 : real(dp) :: y_dp
1378 0 : real(dp) :: q0
1379 0 : y_dp = y
1380 0 : q0 = Heaviside(x%val - y_dp)
1381 0 : unary%val = Max(x%val, y_dp)
1382 0 : unary%d1val1 = q0*x%d1val1
1383 0 : unary%d1val2 = q0*x%d1val2
1384 0 : end function max_self_int
1385 :
1386 0 : function max_int_self(z, x) result(unary)
1387 : integer, intent(in) :: z
1388 : type(auto_diff_real_2var_order1), intent(in) :: x
1389 : type(auto_diff_real_2var_order1) :: unary
1390 0 : real(dp) :: y_dp
1391 0 : real(dp) :: q0
1392 0 : y_dp = z
1393 0 : q0 = Heaviside(x%val - y_dp)
1394 0 : unary%val = Max(x%val, y_dp)
1395 0 : unary%d1val1 = q0*x%d1val1
1396 0 : unary%d1val2 = q0*x%d1val2
1397 0 : end function max_int_self
1398 :
1399 1930037 : function min_self(x, y) result(binary)
1400 : type(auto_diff_real_2var_order1), intent(in) :: x
1401 : type(auto_diff_real_2var_order1), intent(in) :: y
1402 : type(auto_diff_real_2var_order1) :: binary
1403 1930037 : real(dp) :: q1
1404 1930037 : real(dp) :: q0
1405 1930037 : q0 = Heaviside(-x%val + y%val)
1406 1930037 : q1 = Heaviside(x%val - y%val)
1407 1930037 : binary%val = Min(x%val, y%val)
1408 1930037 : binary%d1val1 = q0*x%d1val1 + q1*y%d1val1
1409 1930037 : binary%d1val2 = q0*x%d1val2 + q1*y%d1val2
1410 1930037 : end function min_self
1411 :
1412 241254 : function min_self_real(x, y) result(unary)
1413 : type(auto_diff_real_2var_order1), intent(in) :: x
1414 : real(dp), intent(in) :: y
1415 : type(auto_diff_real_2var_order1) :: unary
1416 241254 : real(dp) :: q0
1417 241254 : q0 = Heaviside(-x%val + y)
1418 241254 : unary%val = Min(x%val, y)
1419 241254 : unary%d1val1 = q0*x%d1val1
1420 241254 : unary%d1val2 = q0*x%d1val2
1421 241254 : end function min_self_real
1422 :
1423 2 : function min_real_self(z, x) result(unary)
1424 : real(dp), intent(in) :: z
1425 : type(auto_diff_real_2var_order1), intent(in) :: x
1426 : type(auto_diff_real_2var_order1) :: unary
1427 2 : real(dp) :: q0
1428 2 : q0 = Heaviside(-x%val + z)
1429 2 : unary%val = Min(x%val, z)
1430 2 : unary%d1val1 = q0*x%d1val1
1431 2 : unary%d1val2 = q0*x%d1val2
1432 2 : end function min_real_self
1433 :
1434 0 : function min_self_int(x, y) result(unary)
1435 : type(auto_diff_real_2var_order1), intent(in) :: x
1436 : integer, intent(in) :: y
1437 : type(auto_diff_real_2var_order1) :: unary
1438 0 : real(dp) :: y_dp
1439 0 : real(dp) :: q0
1440 0 : y_dp = y
1441 0 : q0 = Heaviside(-x%val + y_dp)
1442 0 : unary%val = Min(x%val, y_dp)
1443 0 : unary%d1val1 = q0*x%d1val1
1444 0 : unary%d1val2 = q0*x%d1val2
1445 0 : end function min_self_int
1446 :
1447 0 : function min_int_self(z, x) result(unary)
1448 : integer, intent(in) :: z
1449 : type(auto_diff_real_2var_order1), intent(in) :: x
1450 : type(auto_diff_real_2var_order1) :: unary
1451 0 : real(dp) :: y_dp
1452 0 : real(dp) :: q0
1453 0 : y_dp = z
1454 0 : q0 = Heaviside(-x%val + y_dp)
1455 0 : unary%val = Min(x%val, y_dp)
1456 0 : unary%d1val1 = q0*x%d1val1
1457 0 : unary%d1val2 = q0*x%d1val2
1458 0 : end function min_int_self
1459 :
1460 2 : function dim_self(x, y) result(binary)
1461 : type(auto_diff_real_2var_order1), intent(in) :: x
1462 : type(auto_diff_real_2var_order1), intent(in) :: y
1463 : type(auto_diff_real_2var_order1) :: binary
1464 2 : real(dp) :: q1
1465 : real(dp) :: q0
1466 2 : q0 = x%val - y%val
1467 2 : q1 = 0.5_dp*sgn(q0)
1468 2 : binary%val = -0.5_dp*y%val + 0.5_dp*x%val + 0.5_dp*Abs(q0)
1469 2 : binary%d1val1 = -0.5_dp*y%d1val1 + 0.5_dp*x%d1val1 + q1*(x%d1val1 - y%d1val1)
1470 2 : binary%d1val2 = -0.5_dp*y%d1val2 + 0.5_dp*x%d1val2 + q1*(x%d1val2 - y%d1val2)
1471 2 : end function dim_self
1472 :
1473 1 : function dim_self_real(x, y) result(unary)
1474 : type(auto_diff_real_2var_order1), intent(in) :: x
1475 : real(dp), intent(in) :: y
1476 : type(auto_diff_real_2var_order1) :: unary
1477 1 : real(dp) :: q1
1478 : real(dp) :: q0
1479 1 : q0 = x%val - y
1480 1 : q1 = 0.5_dp*sgn(q0) + 0.5_dp
1481 1 : unary%val = -0.5_dp*y + 0.5_dp*x%val + 0.5_dp*Abs(q0)
1482 1 : unary%d1val1 = q1*x%d1val1
1483 1 : unary%d1val2 = q1*x%d1val2
1484 1 : end function dim_self_real
1485 :
1486 0 : function dim_real_self(z, x) result(unary)
1487 : real(dp), intent(in) :: z
1488 : type(auto_diff_real_2var_order1), intent(in) :: x
1489 : type(auto_diff_real_2var_order1) :: unary
1490 0 : real(dp) :: q1
1491 : real(dp) :: q0
1492 0 : q0 = x%val - z
1493 0 : q1 = -0.5_dp + 0.5_dp*sgn(q0)
1494 0 : unary%val = -0.5_dp*x%val + 0.5_dp*z + 0.5_dp*Abs(q0)
1495 0 : unary%d1val1 = q1*x%d1val1
1496 0 : unary%d1val2 = q1*x%d1val2
1497 0 : end function dim_real_self
1498 :
1499 0 : function dim_self_int(x, y) result(unary)
1500 : type(auto_diff_real_2var_order1), intent(in) :: x
1501 : integer, intent(in) :: y
1502 : type(auto_diff_real_2var_order1) :: unary
1503 0 : real(dp) :: y_dp
1504 0 : real(dp) :: q1
1505 : real(dp) :: q0
1506 0 : y_dp = y
1507 0 : q0 = x%val - y_dp
1508 0 : q1 = 0.5_dp*sgn(q0) + 0.5_dp
1509 0 : unary%val = -0.5_dp*y_dp + 0.5_dp*x%val + 0.5_dp*Abs(q0)
1510 0 : unary%d1val1 = q1*x%d1val1
1511 0 : unary%d1val2 = q1*x%d1val2
1512 0 : end function dim_self_int
1513 :
1514 0 : function dim_int_self(z, x) result(unary)
1515 : integer, intent(in) :: z
1516 : type(auto_diff_real_2var_order1), intent(in) :: x
1517 : type(auto_diff_real_2var_order1) :: unary
1518 0 : real(dp) :: y_dp
1519 0 : real(dp) :: q1
1520 : real(dp) :: q0
1521 0 : y_dp = z
1522 0 : q0 = x%val - y_dp
1523 0 : q1 = -0.5_dp + 0.5_dp*sgn(q0)
1524 0 : unary%val = -0.5_dp*x%val + 0.5_dp*y_dp + 0.5_dp*Abs(q0)
1525 0 : unary%d1val1 = q1*x%d1val1
1526 0 : unary%d1val2 = q1*x%d1val2
1527 0 : end function dim_int_self
1528 :
1529 0 : function differentiate_auto_diff_real_2var_order1_1(this) result(derivative)
1530 : type(auto_diff_real_2var_order1), intent(in) :: this
1531 : type(auto_diff_real_2var_order1) :: derivative
1532 0 : derivative%val = this%d1val1
1533 0 : derivative%d1val1 = 0.0_dp
1534 0 : derivative%d1val2 = 0.0_dp
1535 0 : end function differentiate_auto_diff_real_2var_order1_1
1536 :
1537 0 : function differentiate_auto_diff_real_2var_order1_2(this) result(derivative)
1538 : type(auto_diff_real_2var_order1), intent(in) :: this
1539 : type(auto_diff_real_2var_order1) :: derivative
1540 0 : derivative%val = this%d1val2
1541 0 : derivative%d1val1 = 0.0_dp
1542 0 : derivative%d1val2 = 0.0_dp
1543 0 : end function differentiate_auto_diff_real_2var_order1_2
1544 :
1545 0 : end module auto_diff_real_2var_order1_module
|