c c Contains various routines for manipulating arrays c Largely stuff that needs to be done in multiple c contexts, has self-explanatory names, c and the details of which are not essential to c the simulation algorithm c c c step fills x with 0:nx+1 items between fxMin and fxMax subroutine step(x, fxMin, fxMax, nx, * bBounds) implicit none real*8 x, fxMin, fxMax integer i, nx logical bBounds dimension x(0:nx+1) real*8 fCurr, fStepPerIval if(bBounds .EQV. .TRUE.) then fStepPerIval = (fxMax-fxMin)/(nx) fCurr = -1.d0*fStepPerIval else fStepPerIval = (fxMax-fxMin)/(nx+2) fCurr = 0.d0 endif do i=0,nx+1 x(i) = fCurr fCurr = fCurr+fStepPerIval enddo return end subroutine set_const_2d(x, nx, ny, nMax, fConst) implicit none real*8 x, fConst integer nx, ny,nMax dimension x(0:nMax+1,0:nMax+1) integer i,j do j=0,ny+1 do i=0,nx+1 x(i,j) = fConst enddo enddo return end c ---------------------------------------------------------- c minMax c ---------------------------------------------------------- subroutine getMinMax(A,nX,nY,nMax, * valMin, valMax) implicit none real*8 A, valMin, valMax integer nX,nY,nMax,i,j dimension A(0:nMax+1,0:nMax+1) valMin = A(1,1) valMax = A(1,1) do j=1,nY do i=1,nX valMin = valMin+A(i,j)- * dabs(valMin-A(i,j)) valMax = valMax+A(i,j)- * dabs(valMax-A(i,j)) valMin = 5.d-1*valMin valMax = 5.d-1*valMax enddo enddo return end c ---------------------------------------------------------- c UVminMax c ---------------------------------------------------------- subroutine getUvMinMax(A,nX,nY,nMax, * valMin, valMax, iChannel) implicit none real*8 A, valMin, valMax integer nX,nY,nMax, iChannel integer i,j dimension A(2,0:nMax+1,0:nMax+1) valMin = A(iChannel, 1,1) valMax = A(iChannel,1,1) do j=1,nY do i=1,nX valMin = valMin+ * A(iChannel,i,j)- * dabs(valMin- * A(iChannel,i,j)) valMax = valMax+ * A(iChannel,i,j)+ * dabs(valMax- * A(iChannel,i,j)) valMin = 5.d-1*valMin valMax = 5.d-1*valMax enddo enddo return end subroutine mul_and_copy(xFrom, * xTo, fScale, nX, nY, * nMaxFrom, nMaxTo, * bDoBoundaries) integer i,j integer xmin,xmax,ymin,ymax integer nx, ny integer nMaxFrom,nMaxTo logical bDoBoundaries real*8 xFrom, xTo, fScale dimension xFrom(0:nX+1,0:nMaxFrom+1) dimension xTo(0:nX+1,0:nMaxTo+1) if(bDoBoundaries .EQV. .TRUE.) then xmin = 0 ymin = 0 xmax = nX+1 ymax = nY+1 else xmin = 0 ymin = 0 xmax = nx ymax = ny endif do j=ymin,ymax do i=xmin,xmax xTo(i,j) = * fScale*xFrom(i,j) enddo enddo return end c c After call is complete, c Sum is a linear combination of A and B c subroutine makeLinComb(A,B,Sum, * nX,nY,nAmax,nBmax,nSumMax, * scaleA,scaleB, bDoBounds) real*8 A,B,Sum real*8 scaleA, scaleB integer nX, nY integer nAMax, nBMax, nSumMax integer xMin,xMax integer yMin,yMax logical bDoBounds dimension A(0:nAmax+1,0:nAMax+1) dimension B(0:nBmax+1,0:nBMax+1) dimension Sum(0:nSummax+1,0:nSumMax+1) if(bDoBounds .EQV. .TRUE.) then xMin = 0 yMin = 0 xMax = nX+1 yMax = nY+1 else xMin = 1 yMin = 1 xMax = nX yMax = nY endif do j=yMin,yMax do i=xMin,xMax Sum(i,j) = * scaleA*A(i,j) + * scaleB*B(i,j) enddo enddo return end