-
Notifications
You must be signed in to change notification settings - Fork 37
Expand file tree
/
Copy pathintegral.f90
More file actions
164 lines (126 loc) · 5.81 KB
/
Copy pathintegral.f90
File metadata and controls
164 lines (126 loc) · 5.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
submodule (calculus) integral
contains
module procedure integral3D1_curv
! integral3D1_curv(f,x,lbnd,ubnd)
!PURPOSEFULLY KEPT WARNING TO MAINTIN CONGRUITY WITH OTHER CALCULUS FUNCTIONS
!/home/zettergm/zettergmdata/GEMINI/numerical/calculus/calculus.f90:512:0:
!warning: unused parameter ‘ubnd’ [-Wunused-parameter]
! function integral3D1_curv(f,x,lbnd,ubnd)
!------------------------------------------------------------
!-------COMPUTE AN INTEGRAL OF A 3D ARRAY ALONG THE 1-DIM. IT IS EXPECTED THAT
!-------GHOST CELLS WILL HAVE BEEN TRIMMED FROM ARRAYS BEFORE
!-------THEY ARE PASSED INTO THIS ROUTINE
!-------
!-------NOTE, AS BEFORE THAT THE GRID MAY BE INDEXED DIFFERENTLY
!-------THAT THE FUNCTION BEING INTEGRATED
!------------------------------------------------------------
integer :: ix1,lx1
lx1=size(f,1)
integral3D1_curv(1,:,:)=0._wp
do ix1=2,lx1
integral3D1_curv(ix1,:,:)=integral3D1_curv(ix1-1,:,:)+0.5d0*(f(ix1,:,:)+f(ix1-1,:,:))*x%dx1(lbnd+ix1-1)
end do
end procedure integral3D1_curv
module procedure integral3D1_curv_alt
!PURPOSEFULLY KEPT WARNING TO MAINTIN CONGRUITY WITH OTHER CALCULUS FUNCTIONS
!/home/zettergm/zettergmdata/GEMINI/numerical/calculus/calculus.f90:539:0:
!warning: unused parameter ‘ubnd’ [-Wunused-parameter]
! function integral3D1_curv_alt(f,x,lbnd,ubnd)
!------------------------------------------------------------
!-------COMPUTE AN INTEGRAL OF A 3D ARRAY ALONG THE 1-DIM. IT IS EXPECTED THAT
!-------GHOST CELLS WILL HAVE BEEN TRIMMED FROM ARRAYS BEFORE
!-------THEY ARE PASSED INTO THIS ROUTINE
!-------
!-------NOTE, AS BEFORE THAT THE GRID MAY BE INDEXED DIFFERENTLY
!-------THAN THE FUNCTION BEING INTEGRATED. ALSO THIS ALT VERSION
!-------INTEGRATES FROM SET OPINT TO THE MAX VALUE ON THE GRID,
!-------RATHER THAN FROM THE MIN VALUE TO A FIXED POINT.
!------------------------------------------------------------
integer :: ix1,lx1
lx1=size(f,1)
integral3D1_curv_alt(lx1,:,:)=0._wp
do ix1=lx1-1,1,-1
!! start from the logical top and sum downward (keep dx positive since the intent is to integrate from fixed point to top)
integral3D1_curv_alt(ix1,:,:)=integral3D1_curv_alt(ix1+1,:,:)+0.5d0*(f(ix1,:,:)+f(ix1+1,:,:))*x%dx1(lbnd+ix1-1+1)
!! +1 since we are starting from top
end do
end procedure integral3D1_curv_alt
module procedure integral2D1_curv
!PURPOSEFULLY KEPT WARNING TO MAINTIN CONGRUITY WITH OTHER CALCULUS FUNCTIONS
!/home/zettergm/zettergmdata/GEMINI/numerical/calculus/calculus.f90:568:0:
!warning: unused parameter ‘ubnd’ [-Wunused-parameter]
! function integral2D1_curv(f,x,lbnd,ubnd)
!------------------------------------------------------------
!-------COMPUTE AN INTEGRAL OF A 2D ARRAY ALONG THE 1-DIM. IT IS EXPECTED THAT
!-------GHOST CELLS WILL HAVE BEEN TRIMMED FROM ARRAYS BEFORE
!-------THEY ARE PASSED INTO THIS ROUTINE
!------------------------------------------------------------
integer :: ix1,lx1
lx1=size(f,1)
integral2D1_curv(1,:)=0._wp
do ix1=2,lx1
integral2D1_curv(ix1,:)=integral2D1_curv(ix1-1,:)+0.5d0*(f(ix1,:)+f(ix1-1,:))*x%dx1(lbnd+ix1-1)
end do
end procedure integral2D1_curv
module procedure integral2D1_curv_alt
!PURPOSEFULLY KEPT WARNING TO MAINTIN CONGRUITY WITH OTHER CALCULUS FUNCTIONS
!/home/zettergm/zettergmdata/GEMINI/numerical/calculus/calculus.f90:592:0:
!warning: unused parameter ‘ubnd’ [-Wunused-parameter]
! function integral2D1_curv_alt(f,x,lbnd,ubnd)
!------------------------------------------------------------
!-------COMPUTE AN INTEGRAL OF A 2D ARRAY ALONG THE 1-DIM. IT IS EXPECTED THAT
!-------GHOST CELLS WILL HAVE BEEN TRIMMED FROM ARRAYS BEFORE
!-------THEY ARE PASSED INTO THIS ROUTINE.
!-------
!-------THIS VERSION INTEGRATES WRT X2
!------------------------------------------------------------
integer :: ix2,lx2
lx2=size(f,1)
integral2D1_curv_alt(1,:)=0._wp
do ix2=2,lx2
integral2D1_curv_alt(ix2,:)=integral2D1_curv_alt(ix2-1,:)+0.5d0*(f(ix2,:)+f(ix2-1,:))*x%dx2(lbnd+ix2-1)
end do
end procedure integral2D1_curv_alt
module procedure integral2D2_curv
!PURPOSEFULLY KEPT WARNING TO MAINTIN CONGRUITY WITH OTHER CALCULUS FUNCTIONS
!/home/zettergm/zettergmdata/GEMINI/numerical/calculus/calculus.f90:618:0:
!warning: unused parameter ‘ubnd’ [-Wunused-parameter]
! function integral2D2_curv(f,x,lbnd,ubnd)
!------------------------------------------------------------
!-------COMPUTE AN INTEGRAL OF A 2D ARRAY ALONG THE 2-DIM.
!-------WITH RESPECT TO X2. IT IS EXPECTED THAT
!-------GHOST CELLS WILL HAVE BEEN TRIMMED FROM ARRAYS BEFORE
!-------THEY ARE PASSED INTO THIS ROUTINE
!-------
!-------IT IS ASSUMED THAT THE INTEGRATION IS ALWAYS OVER THE
!-------ENTIRE GRID (X2ALL).
!------------------------------------------------------------
integer :: ix2,lx2
lx2=size(f,2)
integral2D2_curv(:,1)=0._wp
do ix2=2,lx2
integral2D2_curv(:,ix2)=integral2D2_curv(:,ix2-1)+0.5d0*(f(:,ix2)+f(:,ix2-1))*x%dx2all(lbnd+ix2-1)
end do
end procedure integral2D2_curv
module procedure integral2D2_curv_alt
!PURPOSEFULLY KEPT WARNING TO MAINTIN CONGRUITY WITH OTHER CALCULUS FUNCTIONS
!/home/zettergm/zettergmdata/GEMINI/numerical/calculus/calculus.f90:642:0:
!warning: unused parameter ‘ubnd’ [-Wunused-parameter]
! function integral2D2_curv_alt(f,x,lbnd,ubnd)
!------------------------------------------------------------
!-------COMPUTE AN INTEGRAL OF A 2D ARRAY ALONG THE 2-DIM,
!-------WITH RESPECT TO X3. IT IS EXPECTED THAT
!-------GHOST CELLS WILL HAVE BEEN TRIMMED FROM ARRAYS BEFORE
!-------THEY ARE PASSED INTO THIS ROUTINE.
!-------
!-------IT IS ASSUMED THAT THE INTEGRATION IS ALWAYS OVER THE
!-------ENTIRE GRID (X3ALL).
!------------------------------------------------------------
integer :: ix3,lx3
lx3=size(f,2)
integral2D2_curv_alt(:,1)=0._wp
do ix3=2,lx3
integral2D2_curv_alt(:,ix3)=integral2D2_curv_alt(:,ix3-1)+0.5d0*(f(:,ix3)+f(:,ix3-1))*x%dx3all(lbnd+ix3-1)
end do
end procedure integral2D2_curv_alt
end submodule integral