source: CIVL/examples/fortran/nek5000/verification/driver_speclib_jan.f

main
Last change on this file was ea777aa, checked in by Alex Wilton <awilton@…>, 3 years ago

Moved examples, include, build_default.properties, common.xml, and README out from dev.civl.com into the root of the repo.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@5704 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 4.1 KB
Line 
1 ! An arbitrary polynomial of degree NP-1, using the coefficients
2 ! in COEF and the point X to evaluate
3 ! RES = COEFS(1) + COEFS(2)*X + COEFS(3)*X**2 + COEFS(4)*X**3 + ...
4 REAL FUNCTION POLY(np, coefs, x) !RESULT (RES)
5 IMPLICIT NONE
6 INTEGER np, i
7 REAL coefs(np)
8 REAL x, xe, res, poly
9 res = 0
10 xe = 1
11 DO i=1,np
12 res = res + coefs(i)*xe
13 xe = xe*x
14 END DO
15 poly = res
16 END FUNCTION POLY
17
18 ! Generated by TAPENADE (INRIA, Ecuador team)
19 ! Tapenade 3.16 (develop) - 17 Dec 2020 10:03
20 !
21 ! Differentiation of poly in forward (tangent) mode:
22 ! variations of useful results: res
23 ! with respect to varying inputs: x
24 ! RW status of diff variables: res:out x:in
25 REAL FUNCTION POLY_D(np, coefs, x, xd, res) !RESULT (RESD)
26 IMPLICIT NONE
27 INTEGER np, i
28 REAL coefs(np)
29 REAL x, xe, res
30 REAL xd, xed, resd, poly_d
31 res = 0
32 xe = 1
33 resd = 0.0
34 xed = 0.0
35 DO i=1,np
36 resd = resd + coefs(i)*xed
37 res = res + coefs(i)*xe
38 xed = x*xed + xe*xd
39 xe = xe*x
40 END DO
41 poly_d = resd
42 END FUNCTION POLY_D
43
44 ! This is the function that we want to integrate. It is actually
45 ! defined as the derivative of POLY, which itself is an arbitrary
46 ! polynomial of degree NP-1. POLYD is thus a polynomial of degree
47 ! NP-2. The function is just a thin wrapper around POLY_D, which
48 ! is generated by applying the Automatic Differentiation tool
49 ! Tapenade to the polynomial function.
50 REAL FUNCTION POLYD(np, coefs, x) !RESULT(RESD)
51 IMPLICIT NONE
52 INTEGER np
53 REAL coefs(np)
54 REAL x, res
55 REAL xd, resd, polyd
56 xd = 1.0
57 resd = POLY_D(np, coefs, x, xd, res)
58 polyd = resd
59 END FUNCTION
60
61 SUBROUTINE TEST_ZWGLL(NP,DEG)
62 IMPLICIT NONE
63 INTEGER NP, I, DEG
64 REAL RX, RY, RZ, COEF(DEG)
65 REAL Z(NP), W(NP), COEFS(DEG), COEFS2(DEG), RES, RESD
66 REAL QUADA, QUADB, ONE, NEGONE, DIFF, MINDIFF, TMP
67
68 DO I=1, 2*NP, 2
69 TMP = 2.0*I*ATAN(1)/NP
70!$CVL $ASSUME(COS(TMP) + COS(4*ATAN(1) - TMP) == 0.0);
71 END DO
72!$CVL $ASSUME(2.0*COS(ATAN(1))*COS(ATAN(1)) == 1.0);
73!$CVL $ASSUME(4.0*COS(10.0/3.0*ATAN(1))*COS(10.0/3.0*ATAN(1)) == 3.0)
74!$CVL $ASSUME(SIN(4) .NE. 0.0)
75!$CVL $ASSUME(SIN(6) .NE. 0.0)
76
77 ! COEFS should be a symbolic input. It is currently
78 ! set to some arbitrary values.
79 DO i=1,DEG
80 COEFS(i) = sin(i*1.0)
81 COEFS2(i) = COEFS(i)
82 END DO
83 ! Compute the reference solution by using analytical integration.
84 ONE = 1.0
85 NEGONE = -1.0
86 QUADA = POLY(DEG,COEFS,ONE)
87 QUADA = QUADA - POLY(DEG,COEFS2,NEGONE)
88 ! Compute Gauss quadrature points/weights
89 CALL ZWGLL(Z,W,NP)
90 ! Compute the Integral using Gauss quadrature points/weights
91 QUADB = 0.0
92 DO i=1,NP
93 QUADB = QUADB + W(i) * POLYD(DEG,COEFS,Z(i))
94 END DO
95 ! Compare results and print some diagnostics.
96 DIFF = QUADA - QUADB
97 MINDIFF = 0.0
98 PRINT *, "N Points ", NP, "Degree ", DEG
99 PRINT *, "Ref soln ", QUADA
100 PRINT *, "Quadrature ", QUADB
101 IF(DEG .le. 2*NP-1) THEN
102 PRINT *, "Expected error: ZERO"
103!$CVL $ASSERT(DIFF .EQ. MINDIFF)
104 ELSE
105 PRINT *, "Expected error: NON-ZERO"
106!$CVL $ASSERT(DIFF .NE. MINDIFF)
107 END IF
108 !WRITE(*,*) "Points ", Z(1)
109 !WRITE(*,*) "Weights", W(1)
110 PRINT *, "\n"
111 END SUBROUTINE
112
113 PROGRAM DRIVER
114 IMPLICIT NONE
115 INTEGER NP, DEG
116 ! The printed error should be zero as long as DEG <= (2*NP)-1.
117 ! In the below examples, we have:
118 NP = 2
119 DEG = 2
120 CALL TEST_ZWGLL(NP,DEG) ! Should be correct
121 DEG = 3
122 CALL TEST_ZWGLL(NP,DEG) ! Should be correct
123 DEG = 4
124 CALL TEST_ZWGLL(NP,DEG) ! Should be incorrect
125 NP = 3
126 CALL TEST_ZWGLL(NP,DEG) ! Should be correct
127 DEG = 5
128 CALL TEST_ZWGLL(NP,DEG) ! Should be correct
129 DEG = 6
130 CALL TEST_ZWGLL(NP,DEG) ! Should be incorrect
131 END
Note: See TracBrowser for help on using the repository browser.