34 SUBROUTINE applyoperator(numDim,dimSizes,numComponents,numPoints,opDir,opInterval,numStencils, &
35 stencilSizes,stencilStarts,numValues,stencilWeights,stencilOffsets,stencilID,U,dU)
39 INTEGER(KIND=4),
INTENT(IN) :: numDim, opDir,numStencils, numValues, numComponents
40 INTEGER(KIND=8),
INTENT(IN) :: dimSizes(numdim), numPoints
41 INTEGER(KIND=8),
INTENT(IN) :: opInterval(2*numdim)
42 INTEGER(KIND=4),
INTENT(IN) :: stencilSizes(numstencils),stencilStarts(numstencils)
43 INTEGER(KIND=4),
INTENT(IN) :: stencilOffsets(numvalues)
44 REAL(KIND=8),
INTENT(IN) :: stencilWeights(numvalues)
45 INTEGER(KIND=4),
INTENT(IN) :: stencilID(numpoints)
46 REAL(KIND=8),
INTENT(IN) :: U(numpoints)
47 REAL(KIND=8),
INTENT(OUT) :: dU(numpoints)
49 INTEGER(KIND=8) :: I, J, K, jIndex, jkIndex, kIndex
51 INTEGER(KIND=8) :: plane, pointOffset, iPoint
52 INTEGER(KIND=4) :: iStencil, iWeight
58 DO i = opinterval(1), opinterval(2)
59 istencil = stencilid(i)
61 DO iweight = stencilstarts(istencil),stencilstarts(istencil)+stencilsizes(istencil) - 1
62 du(i) = du(i) + stencilweights(iweight)*u(i+stenciloffsets(iweight))
65 ELSE IF(numdim == 2)
THEN 67 DO j = opinterval(3), opinterval(4)
68 jindex = (j-1)*dimsizes(1)
69 DO i = opinterval(1), opinterval(2)
71 istencil = stencilid(ipoint)
73 DO iweight = stencilstarts(istencil),stencilstarts(istencil)+stencilsizes(istencil) - 1
74 du(ipoint) = du(ipoint) + stencilweights(iweight)*u(ipoint+stenciloffsets(iweight))
78 ELSE IF(opdir == 2)
THEN 80 DO j = opinterval(3), opinterval(4)
82 DO i = opinterval(1), opinterval(2)
84 istencil = stencilid(ipoint)
86 DO iweight = stencilstarts(istencil),stencilstarts(istencil)+stencilsizes(istencil) - 1
87 du(ipoint) = du(ipoint) + stencilweights(iweight)*u(ipoint+stenciloffsets(iweight)*plane)
92 ELSE IF(numdim == 3)
THEN 93 plane = dimsizes(1) * dimsizes(2)
95 DO k = opinterval(5), opinterval(6)
97 DO j = opinterval(3), opinterval(4)
98 jkindex = kindex + (j-1)*dimsizes(1)
99 DO i = opinterval(1), opinterval(2)
101 istencil = stencilid(ipoint)
103 DO iweight = stencilstarts(istencil),stencilstarts(istencil)+stencilsizes(istencil) - 1
104 du(ipoint) = du(ipoint) + stencilweights(iweight)*u(ipoint+stenciloffsets(iweight))
113 pointoffset = dimsizes(1)
118 DO k = opinterval(5), opinterval(6)
120 DO j = opinterval(3), opinterval(4)
121 jkindex = kindex + (j-1)*dimsizes(1)
122 DO i = opinterval(1), opinterval(2)
124 istencil = stencilid(ipoint)
127 DO iweight = stencilstarts(istencil),stencilstarts(istencil)+stencilsizes(istencil) - 1
132 du(ipoint) = du(ipoint) + stencilweights(iweight)*u(ipoint+stenciloffsets(iweight)*pointoffset)
167 SUBROUTINE applyoperatorblobs(numDim,dimSizes,numComponents,numPointsBuffer,opDir,numStencils, &
168 stencilSizes,stencilStarts,numStencilValues,stencilWeights,stencilOffsets,numPointsStencil,&
169 numPointsApply,stencilPoints,U,dU)
173 INTEGER(KIND=4),
INTENT(IN) :: numDim, opDir,numStencils, numStencilValues, numComponents
174 INTEGER(KIND=8),
INTENT(IN) :: numPointsApply, numPointsBuffer
175 INTEGER(KIND=8),
INTENT(IN) :: dimSizes(numdim),numPointsStencil(numstencils)
176 INTEGER(KIND=8),
INTENT(IN) :: stencilPoints(numpointsapply)
177 INTEGER(KIND=4),
INTENT(IN) :: stencilSizes(numstencils),stencilStarts(numstencils)
178 INTEGER(KIND=4),
INTENT(IN) :: stencilOffsets(numstencilvalues)
179 REAL(KIND=8),
INTENT(IN) :: stencilWeights(numstencilvalues)
180 REAL(KIND=8),
INTENT(IN) :: U(numpointsbuffer)
181 REAL(KIND=8),
INTENT(OUT) :: dU(numpointsbuffer)
183 INTEGER(KIND=8) :: stencilPointsOffset, iPoint, pointsStart,pointsEnd,numPointsThisStencil
184 INTEGER(KIND=4) :: iStencil, iWeight, stencilSize, stencilStart, stencilEnd
187 stencilpointsoffset = 1
200 WRITE(*,*)
'numPointsApply:',numpointsapply
201 DO istencil = 1, numstencils
202 numpointsthisstencil = numpointsstencil(istencil)
203 stencilsize = stencilsizes(istencil)
204 stencilstart = stencilstarts(istencil)
205 stencilend = stencilstart+stencilsize-1
206 pointsstart = stencilpointsoffset
207 pointsend = pointsstart + numpointsthisstencil-1
208 CALL applysinglestencil(numdim,dimsizes,numcomponents,numpointsbuffer,opdir,numpointsthisstencil, &
209 stencilpoints(pointsstart:pointsend),stencilsize,stencilweights(stencilstart:stencilend),&
210 stenciloffsets(stencilstart:stencilend),u,du)
211 stencilpointsoffset = stencilpointsoffset+numpointsthisstencil
238 SUBROUTINE applysinglestencil(numDim,dimSizes,numComponents,numPointsBuffer,opDir,numPointsApply, &
239 applyPoints,stencilSize,stencilWeights,stencilOffsets,U,dU)
243 INTEGER(KIND=4),
INTENT(IN) :: numDim, opDir, stencilSize, numComponents
244 INTEGER(KIND=8),
INTENT(IN) :: dimSizes(numdim), numPointsBuffer, numPointsApply
245 INTEGER(KIND=8),
INTENT(IN) :: applyPoints(numpointsapply)
246 INTEGER(KIND=4),
INTENT(IN) :: stencilOffsets(stencilsize)
247 REAL(KIND=8),
INTENT(IN) :: stencilWeights(stencilsize)
248 REAL(KIND=8),
INTENT(IN) :: U(numpointsbuffer)
249 REAL(KIND=8),
INTENT(OUT) :: dU(numpointsbuffer)
251 INTEGER(KIND=8) :: I, iPoint, plane
252 INTEGER(KIND=4) :: iStencil, iWeight
255 DO i = 1,numpointsapply
256 ipoint = applypoints(i)
258 DO iweight = 1, stencilsize
259 du(ipoint) = du(ipoint) + stencilweights(iweight)*u(ipoint+stenciloffsets(iweight))
265 ELSE IF(opdir == 3)
THEN 266 plane = dimsizes(1)*dimsizes(2)
268 DO i = 1, numpointsapply
269 ipoint = applypoints(i)
271 DO iweight = 1,stencilsize
272 du(ipoint) = du(ipoint) + stencilweights(iweight)*u(ipoint+stenciloffsets(iweight)*plane)
subroutine applyoperator(numDim, dimSizes, numComponents, numPoints, opDir, opInterval, numStencils, stencilSizes, stencilStarts, numValues, stencilWeights, stencilOffsets, stencilID, U, dU)
applyoperator applies an operator specified as a stencil set to the provided state data ...
subroutine applyoperatorblobs(numDim, dimSizes, numComponents, numPointsBuffer, opDir, numStencils, stencilSizes, stencilStarts, numStencilValues, stencilWeights, stencilOffsets, numPointsStencil, numPointsApply, stencilPoints, U, dU)
applyoperatorblobs applies an operator by applying each stencil in turn to all the points to which it...
subroutine applysinglestencil(numDim, dimSizes, numComponents, numPointsBuffer, opDir, numPointsApply, applyPoints, stencilSize, stencilWeights, stencilOffsets, U, dU)
applysinglestencil applies an operator by applying a given stencil to the specified points ...