PlasCom2  1.0
XPACC Multi-physics simluation application
MetricOps.f90
Go to the documentation of this file.
1 MODULE metricops
2 
3  USE operators
4  USE grid
5 
6  IMPLICIT NONE
7 
8 CONTAINS
9 
10 
11  SUBROUTINE alphaweight( &
12  numDim,numPointsBuffer,bufferSizes,opInterval, &
13  gridType,gridMetric,alphaDir,alphaW)
14 
15  IMPLICIT NONE
16 
17  INTEGER(KIND=4), INTENT(IN) :: numDim, gridType, alphaDir
18  INTEGER(KIND=8), INTENT(IN) :: bufferSizes(numdim),numPointsBuffer
19  INTEGER(KIND=8), INTENT(IN) :: opInterval(2*numdim)
20  REAL(KIND=8), INTENT(IN), TARGET :: gridMetric(numdim*numdim*numpointsbuffer)
21  REAL(KIND=8), INTENT(OUT) :: alphaW(numpointsbuffer)
22 
23  REAL(KIND=8) :: gridScale
24  INTEGER(KIND=8) :: metricOffset
25 
26  REAL(KIND=8), DIMENSION(:), POINTER :: metricPtr
27 
28  IF(gridtype < rectilinear) THEN
29 
30  gridscale = abs(gridmetric(alphadir))
31 
32  CALL assignmentxa(numdim,numpointsbuffer,buffersizes,opinterval, &
33  gridscale,alphaw)
34 
35  ELSE IF(gridtype == rectilinear) THEN
36 
37 
38  metricoffset = (alphadir-1)*numpointsbuffer
39  metricptr => gridmetric(metricoffset+1:metricoffset+numpointsbuffer)
40 
41  CALL assignmentyabsx(numdim,numpointsbuffer,buffersizes,opinterval, &
42  metricptr,alphaw);
43 
44  ELSE ! Curvilinear
45 
46  metricoffset = (alphadir-1)*numdim*numpointsbuffer
47  metricptr => gridmetric(metricoffset+1:metricoffset+(numdim*numpointsbuffer))
48 
49  CALL veclen(numdim,numpointsbuffer,buffersizes,opinterval, &
50  numdim,metricptr,alphaw)
51 
52  END IF
53 
54  END SUBROUTINE alphaweight
55 
56  SUBROUTINE vhatcomponent( &
57  numDim,numPointsBuffer,bufferSizes,opInterval, &
58  gridType,gridMetric,velDir,velocity,velHatComponent)
59 
60  IMPLICIT NONE
61 
62  INTEGER(KIND=4), INTENT(IN) :: numDim, gridType,velDir
63  INTEGER(KIND=8), INTENT(IN) :: bufferSizes(numdim),numPointsBuffer
64  INTEGER(KIND=8), INTENT(IN) :: opInterval(2*numdim)
65  REAL(KIND=8), INTENT(IN), TARGET :: gridMetric(numdim*numdim*numpointsbuffer)
66  REAL(KIND=8), INTENT(IN), TARGET :: velocity(numdim*numpointsbuffer)
67  REAL(KIND=8), INTENT(OUT) :: velHatComponent(numpointsbuffer)
68 
69 
70  INTEGER :: iDim, jDim
71  INTEGER(KIND=8) :: metricOffset, velOffset
72  REAL(KIND=8) :: gridScale
73 
74  REAL(KIND=8), DIMENSION(:), POINTER :: velPtr
75  REAL(KIND=8), DIMENSION(:), POINTER :: metricPtr
76 
77  ! Get vHat component for given grid type and direction
78  !
79  ! If grid < rectilinear, vhat = constant*V(idim)
80  ! metric = (constant_x, constant_y, constant_z)
81  ! If grid == rectilinear, vhat = metric(idim)*V(idim)
82  ! metric = <M_x,M_y,M_z> [i.e. diagonal per point]
83  ! If grid == curvilinear, vhat = Metric(idim)*V(idim)
84  ! metric = <Mx_i Mx_j Mx_k My_i ... Mz_k> [tensor per point]
85  !
86 ! DO iDim = 1,numDim
87 ! velPtr => velocity((iDim-1)*numPointsBuffer+1:(iDim-1)*numPointsBuffer+numPointsBuffer)
88 ! WRITE(*,*) 'Velocity(',iDim,') = ',velPtr
89 ! END DO
90 
91  IF(gridtype < rectilinear) THEN
92 
93  gridscale = gridmetric(veldir)
94  veloffset = (veldir-1)*numpointsbuffer
95  velptr => velocity(veloffset+1:veloffset+numpointsbuffer)
96 
97  CALL yax(numdim,numpointsbuffer,buffersizes,opinterval, &
98  gridscale,velptr,velhatcomponent)
99 
100  ELSE IF(gridtype == rectilinear) THEN
101 
102 
103  metricoffset = (veldir-1)*numpointsbuffer
104  metricptr => gridmetric(metricoffset+1:metricoffset+numpointsbuffer)
105  velptr => velocity(metricoffset+1:metricoffset+numpointsbuffer)
106 
107  CALL zxy(numdim,numpointsbuffer,buffersizes,opinterval, &
108  metricptr,velptr,velhatcomponent);
109 
110  ELSE ! Curvilinear
111 
112  metricoffset = (veldir-1)*numdim*numpointsbuffer
113  metricptr => gridmetric(metricoffset+1:metricoffset+(numdim*numpointsbuffer))
114 
115  CALL zxdoty(numdim,numpointsbuffer,buffersizes,opinterval, &
116  numdim,metricptr,velocity,velhatcomponent);
117 
118  END IF
119 
120 ! WRITE(*,*) 'VelHat(',velDir,') = ',velHatComponent
121 
122  END SUBROUTINE vhatcomponent
123 
124 
125  SUBROUTINE ijkgradtoxyzdiv( &
126  numDim, numPoints, gridSizes, opInterval, &
127  gridType, gridJacobian,gridMetric,gradVBuffer, &
128  divBuffer)
129 
130  IMPLICIT NONE
131 
132  INTEGER(KIND=4), INTENT(IN) :: numDim, gridType
133  INTEGER(KIND=8), INTENT(IN) :: gridSizes(numdim), numPoints
134  INTEGER(KIND=8), INTENT(IN) :: opInterval(2*numdim)
135  REAL(KIND=8), INTENT(IN) :: gridJacobian(numpoints)
136  REAL(KIND=8), INTENT(IN), TARGET :: gridMetric(numdim*numdim*numpoints)
137  REAL(KIND=8), INTENT(IN), TARGET :: gradVBuffer(numdim*numdim*numpoints)
138  REAL(KIND=8), INTENT(OUT) :: divBuffer(numpoints)
139 
140  INTEGER :: iDim, jDim
141  INTEGER(KIND=8) :: metricOffset, gradOffset
142  REAL(KIND=8) :: gridScale
143 
144  REAL(KIND=8), DIMENSION(:), POINTER :: gradPtr
145  REAL(KIND=8), DIMENSION(:), POINTER :: metricPtr
146 
147  IF(gridtype > rectilinear) THEN ! full curvilinear
148  DO idim = 1,numdim
149  DO jdim = 1,numdim
150  gradoffset = ((idim-1)*numdim+(jdim-1))*numpoints
151  metricoffset = ((idim-1)+(jdim-1)*numdim)*numpoints
152  metricptr => gridmetric(metricoffset+1:metricoffset+numpoints)
153  gradptr => gradvbuffer(gradoffset+1:gradoffset+numpoints)
154  CALL ywxpy(numdim,numpoints,gridsizes,opinterval, &
155  metricptr,gradptr,divbuffer)
156  END DO
157  END DO
158  CALL yxy(numdim,numpoints,gridsizes,opinterval,gridjacobian,divbuffer)
159  ELSE IF(gridtype < rectilinear) THEN ! uniform rectangular
160  DO idim = 1,numdim
161  gridscale = gridmetric(idim)
162  gradoffset = ((idim-1)*(numdim+1))*numpoints
163  gradptr => gradvbuffer(gradoffset+1:gradoffset+numpoints)
164  CALL yaxpy(numdim,numpoints,gridsizes,opinterval, &
165  gridscale,gradptr, divbuffer)
166  END DO
167  CALL xax(numdim,numpoints,gridsizes,opinterval, &
168  gridjacobian(1),divbuffer)
169  ELSE ! rectilinear (weirdo)
170  DO idim = 1,numdim
171  metricoffset = (idim-1)*numpoints
172  metricptr => gridmetric(metricoffset+1:metricoffset+numpoints)
173  gradoffset = ((idim-1)*(numdim+1))*numpoints
174  gradptr => gradvbuffer(gradoffset+1:gradoffset+numpoints)
175  CALL ywxpy(numdim,numpoints,gridsizes,opinterval, &
176  metricptr,gradptr,divbuffer)
177  END DO
178  CALL yxy(numdim,numpoints,gridsizes,opinterval,gridjacobian,divbuffer)
179  END IF
180 
181  END SUBROUTINE ijkgradtoxyzdiv
182 
184  SUBROUTINE gradijktogradxyz( &
185  numDim, numPoints, gridSizes, opInterval, gridType, &
186  gridJacobian,gridMetric,gradIJK, gradXYZ)
187 
188  IMPLICIT NONE
189 
190  INTEGER(KIND=4), INTENT(IN) :: numDim, gridType
191  INTEGER(KIND=8), INTENT(IN) :: gridSizes(numdim), numPoints
192  INTEGER(KIND=8), INTENT(IN) :: opInterval(2*numdim)
193  REAL(KIND=8), INTENT(IN) :: gridJacobian(numpoints)
194  REAL(KIND=8), INTENT(IN), TARGET :: gridMetric(numdim*numdim*numpoints)
195  REAL(KIND=8), INTENT(IN), TARGET :: gradIJK(numdim*numpoints)
196  REAL(KIND=8), INTENT(OUT),TARGET :: gradXYZ(numdim*numpoints)
197 
198  INTEGER :: iDim, jDim
199  INTEGER(KIND=8) :: metricOffset, gradIJKOffset, gradXYZOffset
200  REAL(KIND=8) :: gridScale
201  REAL(KIND=8) :: zero
202 
203  REAL(KIND=8), DIMENSION(:), POINTER :: gradIJKPtr
204  REAL(KIND=8), DIMENSION(:), POINTER :: gradXYZPtr
205  REAL(KIND=8), DIMENSION(:), POINTER :: metricPtr
206 
207  zero = 0.0_8
208 
209  IF(gridtype > rectilinear) THEN ! full curvilinear
210 
211  ! Note: only need to zero for curvilinear, other metric types
212  ! utilize assignment-type kernels
213  DO idim = 1,numdim
214  gradxyzoffset = (idim-1)*numpoints
215  gradxyzptr => gradxyz(gradxyzoffset+1:gradxyzoffset+numpoints)
216  CALL assignmentxa(numdim,numpoints,gridsizes,opinterval,zero,gradxyzptr)
217  END DO
218 
219  DO idim = 1,numdim
220  gradxyzoffset = (idim-1)*numpoints
221  gradxyzptr => gradxyz(gradxyzoffset+1:gradxyzoffset+numpoints)
222  DO jdim = 1,numdim
223  gradijkoffset = (jdim-1)*numpoints
224  gradijkptr => gradijk(gradijkoffset+1:gradijkoffset+numpoints)
225  metricoffset = ((jdim-1)*numdim+(idim-1))*numpoints
226  metricptr => gridmetric(metricoffset+1:metricoffset+numpoints)
227  CALL ywxpy(numdim,numpoints,gridsizes,opinterval, &
228  metricptr,gradijkptr,gradxyzptr)
229  END DO
230  CALL yxy(numdim,numpoints,gridsizes,opinterval,gridjacobian,gradxyzptr)
231  END DO
232 
233  ELSE IF(gridtype < rectilinear) THEN ! uniform rectangular
234  DO idim = 1,numdim
235  gridscale = gridmetric(idim)*gridjacobian(1)
236  gradijkoffset = (idim-1)*numpoints
237  gradijkptr => gradijk(gradijkoffset+1:gradijkoffset+numpoints)
238  gradxyzptr => gradxyz(gradijkoffset+1:gradijkoffset+numpoints)
239  CALL yax(numdim,numpoints,gridsizes,opinterval, &
240  gridscale,gradijkptr, gradxyzptr)
241  END DO
242  ELSE ! rectilinear (weirdo)
243  DO idim = 1,numdim
244  metricoffset = (idim-1)*numpoints
245  metricptr => gridmetric(metricoffset+1:metricoffset+numpoints)
246  gradijkptr => gradijk(metricoffset+1:metricoffset+numpoints)
247  gradxyzptr => gradxyz(metricoffset+1:metricoffset+numpoints)
248  CALL zxy(numdim,numpoints,gridsizes,opinterval, &
249  metricptr,gradijkptr,gradxyzptr)
250  CALL yxy(numdim,numpoints,gridsizes,opinterval,gridjacobian,gradxyzptr)
251  END DO
252  END IF
253 
254  END SUBROUTINE gradijktogradxyz
255 
256 
257 END MODULE metricops
subroutine vhatcomponent(numDim, numPointsBuffer, bufferSizes, opInterval, gridType, gridMetric, velDir, velocity, velHatComponent)
Definition: MetricOps.f90:59
subroutine ywxpy(numDim, numPoints, bufferSize, bufferInterval, W, X, Y)
YWXPY point-wise operator performing Y = WX + Y, where all are vectors.
Definition: Operators.f90:835
subroutine assignmentyabsx(numDim, numPoints, bufferSize, bufferInterval, X, Y)
ASSIGNMENTYABSX point-wise operator performing X = scalar a.
Definition: Operators.f90:1275
subroutine yaxpy(numDim, numPoints, bufferSize, bufferInterval, a, X, Y)
YAXPY point-wise operator performing Y = aX + Y (scalar a)
Definition: Operators.f90:424
subroutine yxy(numDim, numPoints, bufferSize, bufferInterval, X, Y)
YXY point-wise operator performing Y = XY (all vectors)
Definition: Operators.f90:731
subroutine veclen(numDim, numPoints, bufferSize, bufferInterval, numComp, V, lenV)
VECLEN point-wise operator returning the length of a numComp-dimensional vector.
Definition: Operators.f90:1328
subroutine assignmentxa(numDim, numPoints, bufferSize, bufferInterval, a, X)
ASSIGNMENTXA point-wise operator performing X = scalar a.
Definition: Operators.f90:1222
subroutine ijkgradtoxyzdiv(numDim, numPoints, gridSizes, opInterval, gridType, gridJacobian, gridMetric, gradVBuffer, divBuffer)
Definition: MetricOps.f90:129
subroutine zxdoty(numDim, numPoints, bufferSize, bufferInterval, numComponents, X, Y, Z)
ZXDOTY numComponents-vector inner product Z = X * Y.
Definition: Operators.f90:1050
Definition: Grid.f90:1
subroutine gradijktogradxyz(numDim, numPoints, gridSizes, opInterval, gridType, gridJacobian, gridMetric, gradIJK, gradXYZ)
Converts Cartesian (computational) gradient to physical coordinates.
Definition: MetricOps.f90:187
subroutine alphaweight(numDim, numPointsBuffer, bufferSizes, opInterval, gridType, gridMetric, alphaDir, alphaW)
Definition: MetricOps.f90:14
integer(kind=4), parameter rectilinear
Definition: Grid.f90:7
subroutine yax(numDim, numPoints, bufferSize, bufferInterval, a, X, Y)
YAX point-wise operator performing Y = aX (scalar a)
Definition: Operators.f90:628
subroutine zxy(numDim, numPoints, bufferSize, bufferInterval, X, Y, Z)
ZXY point-wise operator performing Z = XY (all vectors)
Definition: Operators.f90:679
subroutine xax(numDim, numPoints, bufferSize, bufferInterval, a, X)
XAX point-wise operator performing X = aX (scalar a)
Definition: Operators.f90:1119