! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE IMG3D ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE img3d(b,x,y,z, &,16 nx,ibgn,iend,isk, ny,jbgn,jend,jsk, nz,kbgn,kend,ksk, & bmax,bmin, label,fnkey,time,mode,kslice,jslice,islice, & n,xp,yp,b1,b2,zs2, mgrid, nestgrd, tem1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Produce 2-D HDF images for specified slices of 3-d array b. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! ! MODIFICATION HISTORY: ! ! 9/1/94 (Y. Lu) ! Cleaned up documentation ! ! 2/1/1995 (J. Zhang) ! Added constant p-level plots (mode.eq.6) ! !----------------------------------------------------------------------- ! ! INPUT : ! ! b 3-dimensional array of data ! ! x x coordinate of grid points in physical/comp. space (m) ! y y coordinate of grid points in physical/comp. space (m) ! z z coordinate of grid points in computational space (m) ! ! nx first dimension of b ! ibgn index of first i grid point to be used. ! iend index of last i grid point to be used. ! isk skip or interpolation parameter in i-dir. ! If isk >0, every isk'th data is used, ! If isk <0, each grid zone is sub-divided into isk zones. ! ! ny second dimension of b ! jbgn index of first j grid point to be used. ! jend index of last j grid point to be used. ! jsk skip or interpolation parameter in j-dir. ! If jsk >0, every jsk'th data is used, ! If jsk <0, each grid zone is sub-divided into jsk zones. ! ! nz third dimension of b ! kbgn index of first k grid point to be used. ! kend index of last k grid point to be used. ! ksk skip or interpolation parameter in k-dir. ! If ksk >0, every ksk'th data is used, ! If ksk <0, each grid zone is sub-divided into ksk zones. ! ! label character string describing the contents of b ! fnkey file name key ! time time of data in seconds ! ! mode slice orientation indicator ! mode = 1, x-y slice at z index kslice is plotted. ! mode = 2, x-z slice at y index jslice is plotted. ! mode = 3, y-z slice at x index islice is plotted. ! mode = 0, all of the three slices above are plotted. ! ! kslice k index of plane for mode=1 x-y slice ! jslice j index of plane for mode=2 x-z slice ! islice i index of plane for mode=1 y-z slice ! ! OUTPUT : ! ! n horizontal dimension of arbitary vertical cross section ! xp x-coordinate of grid points on arbitary ! vertical cross-section ! yp y-coordinate of grid points on arbitary ! vertical cross-section ! b1 2-D field interpolated to a horizontal cross-section ! b2 2-D field interpolated to a vertical corss-section ! zs2 z-coordinate of grid points on arbitary vertical ! cross-section ! mgrid the grid number ! nestgrd flag for nested grid run. ! ! WORK ARRAYS: ! ! tem1 Temporary work array. ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! dimemsions of 3-D input data arrray b INTEGER :: n ! horizontal dimension of arbitary ! vertical cross section. REAL :: b(nx,ny,nz) ! 3-dimensional array of data REAL :: x(nx,ny,nz) ! x coordinate of grid points in physical ! /comp. space (m) REAL :: y(ny,ny,nz) ! y coordinate of grid points in physical ! /comp. space (m) REAL :: z(nz,ny,nz) ! z coordinate of grid points in physical ! /comp. space (m) REAL :: bmax,bmin ! upper and lower bounds of b used in IMG2D INTEGER :: kslice ! k index of plane for mode=1 x-y slice INTEGER :: jslice ! j index of plane for mode=1 x-z slice INTEGER :: islice ! i index of plane for mode=1 y-z slice REAL :: b1(nx,ny) ! 2-D field interpolated to a horizontal ! cross-section REAL :: b2(n,nz) ! 2-D field interpolated to a vertical ! corss-section. REAL :: zs2(n,nz) ! z-coordinate of grid points on arbitary ! vertical cross-section REAL :: xp(n) ! x-coordinate of grid points on arbitary ! vertical cross-section REAL :: yp(n) ! y-coordinate of grid points on arbitary ! vertical cross-section INTEGER :: ibgn,iend,isk ! index of first and last i grid point; ! skip/interpolation parameter in i-dir INTEGER :: jbgn,jend,jsk ! index of first and last j grid point; ! skip/interpolation parameter in j-dir INTEGER :: kbgn,kend,ksk ! index of first and last k grid point; ! skip/interpolation parameter in k-dir INTEGER :: mode ! slice orientation indicator INTEGER :: mgrid ! the grid number INTEGER :: nestgrd ! flag for nested grid run. REAL :: tem1(*) ! temporary work array INTEGER :: length ! the length of string CHARACTER (LEN=* ) :: label ! character string describing the contents ! of b CHARACTER (LEN=80 ) :: timsnd ! character string describing the time of b CHARACTER (LEN=* ) :: fnkey ! file name key INTEGER :: tmstrln REAL :: time ! time of data (s) ! !----------------------------------------------------------------------- ! ! Common blocks for plotting control parameters ! !----------------------------------------------------------------------- ! REAL :: x01,y01 ! the first point of interpolation REAL :: x02,y02 ! the second point of interpolation REAL :: z01 ! the given height of the slice REAL :: sinaf,cosaf,dist,sqrtdxy COMMON /slicev/x01,y01,x02,y02,sinaf,cosaf,dist,sqrtdxy COMMON /sliceh/z01 ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,ij,ik,jk,idata,jdata,kdata CHARACTER (LEN=120) :: imgfn CHARACTER (LEN=35) :: gridnum DATA gridnum /'123456789abcdefghijklmnopqrstuvwxyz'/ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! mode=1 Plot x-y cross-section ! !----------------------------------------------------------------------- ! CALL cvttsnd( time, timsnd, tmstrln ) IF(mode == 1 .OR. mode == 0 ) THEN k = kslice DO j=jbgn,jend DO i=ibgn,iend ij = i-ibgn+1 + (j-jbgn)*(iend-ibgn+1) tem1(ij)=b(i,j,k) END DO END DO imgfn = fnkey length = LEN( fnkey ) WRITE(imgfn(length+1:length+5),'(a,i3.3)') '.k',k imgfn(length+6:120) = label//timsnd(1:tmstrln) length = 120 CALL strlnth( imgfn, length) IF( nestgrd == 1 ) THEN WRITE(imgfn(length+1:length+3),'(''.G'',A)') & gridnum(mgrid:mgrid) length = length + 3 END IF idata = iend-ibgn+1 jdata = jend-jbgn+1 CALL img2d(tem1,idata,1,idata,isk,jdata,1,jdata,isk, & bmax,bmin, & imgfn(1:length)) ! !----------------------------------------------------------------------- ! ! mode=2 Plot x-z cross-section ! !----------------------------------------------------------------------- ! ELSE IF (mode == 2 .OR. mode == 0 ) THEN j = jslice DO k=kbgn,kend DO i=ibgn,iend ik = i-ibgn+1 + (k-kbgn)*(iend-ibgn+1) tem1(ik)=b(i,j,k) END DO END DO imgfn = fnkey length = LEN( fnkey ) WRITE(imgfn(length+1:length+5),'(a,i3.3)') '.j',j imgfn(length+6:120) = label//timsnd(1:tmstrln) length = 120 CALL strlnth( imgfn, length) IF( nestgrd == 1 ) THEN WRITE(imgfn(length+1:length+3),'(''.G'',A)') & gridnum(mgrid:mgrid) length = length + 3 END IF idata = iend-ibgn+1 kdata = kend-kbgn+1 CALL img2d(tem1,idata,1,idata,isk,kdata,1,kdata,ksk, & bmax,bmin, & imgfn(1:length)) ! !----------------------------------------------------------------------- ! ! mode=3 Plot y-z cross-section ! !----------------------------------------------------------------------- ! ELSE IF ( mode == 3 .OR. mode == 0) THEN i = islice DO k=kbgn,kend DO j=jbgn,jend jk = j-jbgn+1 + (k-kbgn)*(jend-jbgn+1) tem1(jk)=b(i,j,k) END DO END DO imgfn = fnkey length = LEN( fnkey ) WRITE(imgfn(length+1:length+5),'(a,i3.3)') '.i',i imgfn(length+6:120) = label//timsnd(1:tmstrln) length = 120 CALL strlnth( imgfn, length) IF( nestgrd == 1 ) THEN WRITE(imgfn(length+1:length+3),'(''.G'',A)') & gridnum(mgrid:mgrid) length = length + 3 END IF jdata = jend-jbgn+1 kdata = kend-kbgn+1 CALL img2d(tem1,jdata,1,jdata,jsk,kdata,1,kdata,ksk, & bmax,bmin, & imgfn(1:length)) ! !----------------------------------------------------------------------- ! ! mode=4 Plot horizontal slice at given height ! !----------------------------------------------------------------------- ! ELSE IF( mode == 4 ) THEN CALL secthrz(nx,ny,nz,b,z,b1) DO j=jbgn,jend DO i=ibgn,iend ij = i-ibgn+1 + (j-jbgn)*(iend-ibgn+1) tem1(ij)=b1(i,j) END DO END DO imgfn = fnkey length = LEN( fnkey ) WRITE(imgfn(length+1:length+5),'(a,i3.3)') '.z',nint(z01) imgfn(length+6:120) = label//timsnd(1:tmstrln) length = 120 CALL strlnth( imgfn, length) IF( nestgrd == 1 ) THEN WRITE(imgfn(length+1:length+3),'(''.G'',A)') & gridnum(mgrid:mgrid) length = length + 3 END IF idata = iend-ibgn+1 jdata = jend-jbgn+1 CALL img2d(tem1,idata,1,idata,isk,jdata,1,jdata,jsk, & bmax,bmin, & imgfn(1:length)) ! !----------------------------------------------------------------------- ! ! mode=5 Plot vectical slice through two given points ! !----------------------------------------------------------------------- ! ELSE IF( mode == 5 ) THEN CALL sectvrt(nx,ny,nz,b,x,y,z,b2,zs2,n,xp,yp) DO k=kbgn,kend DO i=ibgn,iend ik = i-ibgn+1 + (k-kbgn)*(iend-ibgn+1) tem1(ik)=b2(i,k) END DO END DO imgfn = fnkey length = LEN( fnkey ) WRITE(imgfn(length+1:length+5),'(a,i3.3)') '.v',nint(x01) imgfn(length+6:120) = label//timsnd(1:tmstrln) length = 120 CALL strlnth( imgfn, length) IF( nestgrd == 1 ) THEN WRITE(imgfn(length+1:length+3),'(''.G'',A)') & gridnum(mgrid:mgrid) length = length + 3 END IF idata = iend-ibgn+1 kdata = kend-kbgn+1 CALL img2d(tem1,idata,1,idata,isk,kdata,1,kdata,ksk, & bmax,bmin, & imgfn(1:length+4)) ! !----------------------------------------------------------------------- ! ! mode=6 Plot on constant pressure-level ! !----------------------------------------------------------------------- ! ELSE IF( mode == 6 ) THEN CALL secthrz(nx,ny,nz,b,z,b1) DO j=jbgn,jend DO i=ibgn,iend ij = i-ibgn+1 + (j-jbgn)*(iend-ibgn+1) tem1(ij)=b1(i,j) END DO END DO imgfn = fnkey length = LEN( fnkey ) WRITE(imgfn(length+1:length+5),'(a,i3.3)') '.z',nint(z01) imgfn(length+6:120) = label//timsnd(1:tmstrln) length = 120 CALL strlnth( imgfn, length) IF( nestgrd == 1 ) THEN WRITE(imgfn(length+1:length+3),'(''.G'',A)') & gridnum(mgrid:mgrid) length = length + 3 END IF idata = iend-ibgn+1 jdata = jend-jbgn+1 CALL img2d(tem1,idata,1,idata,isk,jdata,1,jdata,jsk, & bmax,bmin, & imgfn(1:length)) ! END IF RETURN END SUBROUTINE img3d ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE IMG3D0 ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE img3d0(b,nx,ibgn,iend,isk, ny,jbgn,jend,jsk, & 4,7 nz,kbgn,kend,ksk, & bmax,bmin, label,fnkey,time,mode,kslice,jslice,islice, & mgrid,nestgrd, tem1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Produce 2-D HDF images for specified slices of 3-d array b. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! ! MODIFICATION HISTORY: ! ! 9/1/94 (Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! b 3-dimensional array of data ! ! x x coordinate of grid points in physical/comp. space (m) ! y y coordinate of grid points in physical/comp. space (m) ! z z coordinate of grid points in computational space (m) ! ! nx first dimension of b ! ibgn index of first i grid point to plot ! iend index of last i grid point to plot ! if isk >0, every isk'th data is used, ! if isk <0, each grid zone is sub-divided into isk zone. ! ! ny second dimension of b ! jbgn index of first j grid point to plot ! jend index of last j grid point to plot ! if jsk >0, every jsk'th data is used, ! if jsk <0, each grid zone is sub-divided into jsk zone. ! ! nz third dimension of b ! kbgn index f first k grid point to plot ! kend index of last k grid point to plot ! if ksk >0, every ksk'th data is used, ! if ksk <0, each grid zone is sub-divided into ksk zone. ! ! label character string describing the contents of b ! fnkey File name key ! time time of data in seconds ! ! mode slice orientation indicator ! mode = 1, x-y slice at z index kslice is plotted. ! mode = 2, x-z slice at y index jslice is plotted. ! mode = 3, y-z slice at x index islice is plotted. ! mode = 0, all of the three slices above are plotted. ! ! kslice k index of plane for mode=1 x-y slice ! jslice j index of plane for mode=2 x-z slice ! islice i index of plane for mode=1 y-z slice ! ! mgrid The grid number ! nestgrd Flag for nested grid run. ! ! WORK ARRAYS: ! ! tem1 Temporary work array. ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! 3 dimemsions of b ! integer n ! dimension on horizontal dirction REAL :: b(nx,ny,nz) ! 3-dimensional array of data REAL :: bmax,bmin ! the maximum and minimum value of b INTEGER :: ibgn,iend,isk ! index of first and last i grid point; ! skip/interpolation parameter in i-dir INTEGER :: jbgn,jend,jsk ! index of first and last j grid point; ! skip/interpolation parameter in j-dir INTEGER :: kbgn,kend,ksk ! index of first and last k grid point; ! skip/interpolation parameter in k-dir INTEGER :: length ! the length of string INTEGER :: idata ! total number of grid points in i-dir INTEGER :: jdata ! total number of grid points in j-dir INTEGER :: kdata ! total number of grid points in k-dir CHARACTER (LEN=* ) :: label ! character string describing the contents ! of b CHARACTER (LEN=80 ) :: timsnd ! character string describing thetime of b CHARACTER (LEN=* ) :: fnkey ! file name key INTEGER :: tmstrln ! slice orientation indicator REAL :: time ! time of data (s) INTEGER :: mode ! slice orientation indicator INTEGER :: kslice ! k index of plane for mode=1 x-y slice INTEGER :: jslice ! j index of plane for mode=1 x-z slice INTEGER :: islice ! i index of plane for mode=1 y-z slice INTEGER :: mgrid ! the grid number INTEGER :: nestgrd ! flag for nested grid run. REAL :: tem1(*) ! temporary work array ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,ij,ik,jk CHARACTER (LEN=120) :: imgfn CHARACTER (LEN=35) :: gridnum DATA gridnum /'123456789abcdefghijklmnopqrstuvwxyz'/ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! mode=1 Plot x-y cross-section ! !----------------------------------------------------------------------- ! CALL cvttsnd( time, timsnd, tmstrln ) IF(mode == 1 .OR. mode == 0 ) THEN k = kslice DO j=jbgn,jend DO i=ibgn,iend ij = i-ibgn+1 + (j-jbgn)*(iend-ibgn+1) tem1(ij)=b(i,j,k) END DO END DO imgfn = fnkey length = LEN( fnkey ) WRITE(imgfn(length+1:length+5),'(a,i3.3)') '.k',k imgfn(length+6:120) = label//timsnd(1:tmstrln) length = 120 CALL strlnth( imgfn, length) IF( nestgrd == 1 ) THEN WRITE(imgfn(length+1:length+3),'(''.G'',A)') & gridnum(mgrid:mgrid) length = length + 3 END IF idata = iend-ibgn+1 jdata = jend-jbgn+1 CALL img2d(tem1,idata,1,idata,isk,jdata,1,jdata,isk ,bmax,bmin, & imgfn(1:length+4)) ! !----------------------------------------------------------------------- ! ! mode=2 Plot x-z cross-section ! !----------------------------------------------------------------------- ! ELSE IF (mode == 2 .OR. mode == 0 ) THEN j = jslice DO k=kbgn,kend DO i=ibgn,iend ik = i-ibgn+1 + (k-kbgn)*(iend-ibgn+1) tem1(ik)=b(i,j,k) END DO END DO imgfn = fnkey length = LEN( fnkey ) WRITE(imgfn(length+1:length+5),'(a,i3.3)') '.j',j imgfn(length+6:120) = label//timsnd(1:tmstrln) length = 120 CALL strlnth( imgfn, length) IF( nestgrd == 1 ) THEN WRITE(imgfn(length+1:length+3),'(''.G'',A)') & gridnum(mgrid:mgrid) length = length + 3 END IF idata = iend-ibgn+1 kdata = kend-kbgn+1 CALL img2d(tem1,idata,1,idata,isk,kdata,1,kdata,ksk, & bmax,bmin, & imgfn(1:length+4)) ! !----------------------------------------------------------------------- ! ! mode=3 Plot y-z cross-section ! !----------------------------------------------------------------------- ! ELSE IF ( mode == 3 .OR. mode == 0) THEN i = islice DO k=kbgn,kend DO j=jbgn,jend jk = j-jbgn+1 + (k-kbgn)*(jend-jbgn+1) tem1(jk)=b(i,j,k) END DO END DO imgfn = fnkey length = LEN( fnkey ) WRITE(imgfn(length+1:length+5),'(a,i3.3)') '.i',i imgfn(length+6:120) = label//timsnd(1:tmstrln) length = 120 CALL strlnth( imgfn, length) IF( nestgrd == 1 ) THEN WRITE(imgfn(length+1:length+3),'(''.G'',A)') & gridnum(mgrid:mgrid) length = length + 3 END IF jdata = jend-jbgn+1 kdata = kend-kbgn+1 CALL img2d(tem1,jdata,1,jdata,jsk,kdata,1,kdata,ksk, & bmax,bmin, & imgfn(1:length+4)) ELSE IF( mode == 4 .OR. mode == 5 .OR. mode == 6 ) THEN WRITE(6,'(a)') & 'Mode 4 or 5 is not available with IMG3D0, call IGM3D instead.' END IF RETURN END SUBROUTINE img3d0 ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE IMG2D ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE img2d(z,nx,ibgn,iend,isk,ny,jbgn,jend,jsk, & 9,3 zmax,zmin,imgfn) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Create an HDF image file 'imgfn' for a 2-D field stored in z. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 4/14/93 ! ! MODIFICATION HISTORY: ! ! 9/1/94 (Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! z a two array containing the field for which a image file ! is to be created. ! nx, ny the dimensions of array z. ! ibgn index of first i grid point to be used. ! iend index of last i grid point to be used. ! isk skip or interpolation parameter in i-dir. ! If isk >0, every isk'th data is used, ! If isk <0, each grid zone is sub-divided into isk zones. ! ! jbgn index of first j grid point to be used. ! jend index of last j grid point to be used. ! jsk skip or interpolation parameter in j-dir. ! If jsk >0, every jsk'th data is used, ! If jsk <0, each grid zone is sub-divided into jsk zones. ! ! zmax,zmin ! prespecified upper and lower bounds of the array value ! to be used to scale the image. ! ! imgfn the name of the output image file. ! ! OUTPUT: ! ! None. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx, ny ! dimensions of array z REAL :: z(nx,ny) ! A two array containing the field for ! which a image file is to be created. INTEGER :: ibgn,iend,isk ! index of first and last i grid point; ! skip/interpolation parameter in i-dir INTEGER :: jbgn,jend,jsk ! index of first and last j grid point; ! skip/interpolation parameter in j-dir REAL :: zmax,zmin ! prespecified upper and lower bounds ! of the array value to be used to scale ! the image. CHARACTER (LEN=*) :: imgfn ! name of the output image file INTEGER :: maxdim ! maximum number of gird points in work ! array image INTEGER :: icompres INTEGER :: idata ! total number of grid points in i-dir INTEGER :: jdata ! total number of grid points in j-dir INTEGER :: d8pimg, iret, imax,imin, nimage PARAMETER (maxdim= 512 , icompres=11) CHARACTER (LEN=1) :: image(maxdim*maxdim) REAL :: zx, zn ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF( isk > 0 )THEN idata = (iend-ibgn)/isk + 1 ELSE idata = (iend-ibgn)*ABS(isk) + 1 END IF IF( jsk > 0 )THEN jdata = (jend-jbgn)/jsk + 1 ELSE jdata = (jend-jbgn)*ABS(jsk) + 1 END IF IF( idata*jdata > maxdim*maxdim ) THEN WRITE(6,'(1x,a,a/)') 'Character work array image ', & 'defined in IMG2D not big enough. Job stopped in IMG2D.' CALL arpsstop('arpsstop called from IMG2D due to character length',1) END IF ! !----------------------------------------------------------------------- ! ! RASTERIZE and store as HDF image ! !----------------------------------------------------------------------- ! CALL rasteriz(z, nx,ibgn,iend,isk, ny,jbgn,jend,jsk,zmax,zmin, & image,nimage,imax,imin) !mx print*,'D8pimg is not called. No HDF image produced.' RETURN ! D8pimg not found in HDF library for some reason ! iret = D8pimg (imgfn , image, idata,jdata, icompres) ! ! IF (iret /= 0) THEN ! WRITE(6,'(/1x,a,a,a,i3)') & ! 'Error writing HDF file ',imgfn,'. Error flag was ',iret ! END IF ! !----------------------------------------------------------------------- ! ! Find Max & Min (for output to screen only) ! !----------------------------------------------------------------------- ! CALL a3dmax0(z, 1,nx,ibgn,iend, 1,ny,jbgn,jend,1,1,1,1, zx, zn) WRITE(6,'(/1x,3a)') 'Image file ',imgfn,' created.' WRITE(6,'(/1x,a,e15.5,a,e15.5,a,i4,a,i4/)') & 'zmax=',zx,' zmin=',zn,' imin=',imin,' imax=',imax ! 100 FORMAT (1X,(a,2X),1P,2G16.7,0P, 2X,2I4,1X,2F5.2) END SUBROUTINE img2d ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE RASTERIZ ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE rasteriz (z, nx,ibgn,iend,isk0, ny,jbgn,jend,jsk0, & 1,1 zmax,zmin, image, nimage,imax,imin) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Convert a 2-D real array into a raster form. ! ! This routine should be equivalent to the C routine floattor8.c, ! p. 2.10 of NCSA HDF manual. ! ! Values are scaled to be in the range 1 to 254 (Icharmin to Icharmax). ! Image is a 1-D array and must be stored upside-down. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 4/14/93 ! ! MODIFICATION HISTORY: ! ! 9/1/94 (Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! z a two array containing the field for which a image ! file is to be created. ! nx, ny the dimensions of array z. ! zmax,zmin the maximum or minimum value of z ! ! OUTPUT: ! ! image 1-D array ! imax,imin the maximum and minimum value of image ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx, ny ! dimensions of array z REAL :: z(nx,ny) ! A two array containing the field for ! which a image file is to be created. INTEGER :: ibgn,iend,isk ! index of first and last i grid point; ! skip/interpolation parameter in i-dir INTEGER :: jbgn,jend,jsk ! index of first and last j grid point; ! skip/interpolation parameter in j-dir INTEGER :: isk0,jsk0 REAL :: zmax, zmin ! the maximum or minimum value of z INTEGER :: imax, imin, nimage ! the maximum and minimum value and ! dimension of imag CHARACTER (LEN=1) :: image(nimage) ! !----------------------------------------------------------------------- ! ! Misc. variables: ! !----------------------------------------------------------------------- ! INTEGER :: icharmax,icharmin,icp1,iblack PARAMETER (icharmax=254, icharmin=2, icp1=icharmax+1, iblack=255) INTEGER :: i,j,k, ivalue, rtoi, isub, jsub REAL :: step, rvalue ,arg, zj1,zj2 ! !----------------------------------------------------------------------- ! ! Inline funtion ! !----------------------------------------------------------------------- ! rtoi( arg ) = nint ((arg-zmin)/step) + icharmin ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! step = (zmax - zmin) / icp1 IF (step <= 0.) THEN PRINT *, '.....Error in RASTERIZ: Zmax <= Zmin' RETURN END IF imax = -32000 imin = 32000 isk = isk0 jsk = jsk0 IF( isk*jsk < 0 ) THEN IF( isk < 0 .AND. jsk == 1 ) THEN jsk = -1 ELSE IF( jsk < 0 .AND. isk == 1 ) THEN isk = -1 ELSE WRITE(6,'(/1x,a,/1x,a,i2,a,i2,/1x,a/)') & 'Error in RASTERIZ: isk and jsk must have the same sign.', & 'isk = ', isk, ' jsk= ', jsk, & 'Job stopped in the subroutine.' CALL arpsstop('arpsstop called from RASTERIZ due to sign error',1) END IF END IF IF( isk > 0 .AND. jsk > 0 ) THEN k = 0 DO j=jend,jbgn,-jsk DO i=ibgn,iend,isk rvalue = z(i,j) ivalue = MIN( MAX( rtoi(rvalue),icharmin ), icharmax ) imax = MAX (imax, ivalue) imin = MIN (imin, ivalue) k = k + 1 image(k)= CHAR (ivalue) END DO END DO nimage = k ELSE IF( isk < 0 .AND. jsk < 0 ) THEN ! Case with binlinear interpolation. k = 0 DO j=jend,jbgn+1,-1 DO jsub=1,ABS(jsk) DO i=ibgn,iend-1 DO isub=1,ABS(isk) zj1=z(i,j )+(isub-1.0)/ABS(isk)*(z(i+1,j )-z(i,j )) zj2=z(i,j-1)+(isub-1.0)/ABS(isk)*(z(i+1,j-1)-z(i,j-1)) rvalue = zj1+(jsub-1.0)/ABS(jsk)*(zj2-zj1) ivalue = MIN( MAX( rtoi(rvalue),icharmin ), icharmax ) imax = MAX (imax, ivalue) imin = MIN (imin, ivalue) k = k + 1 image(k)= CHAR (ivalue) END DO END DO rvalue = z(iend,j)+(jsub-1.0)/ABS(jsk) * & (z(iend,j-1)-z(iend,j)) ivalue = MIN( MAX( rtoi(rvalue),icharmin ), icharmax ) imax = MAX (imax, ivalue) imin = MIN (imin, ivalue) k = k + 1 image(k)= CHAR (ivalue) END DO END DO DO i=ibgn,iend-1 DO isub=1,ABS(isk) zj1=z(i,jbgn)+(isub-1.0)/ABS(isk)*(z(i+1,jbgn)-z(i,jbgn)) rvalue = zj1 ivalue = MIN( MAX( rtoi(rvalue),icharmin ), icharmax ) imax = MAX (imax, ivalue) imin = MIN (imin, ivalue) k = k + 1 image(k)= CHAR (ivalue) END DO END DO rvalue = z(iend,jbgn) ivalue = MIN( MAX( rtoi(rvalue),icharmin ), icharmax ) imax = MAX (imax, ivalue) imin = MIN (imin, ivalue) k = k + 1 image(k)= CHAR (ivalue) nimage = k END IF RETURN END SUBROUTINE rasteriz