SUBROUTINE getcoamps(nx_ext, ny_ext, nz_ext, & 1,8 dir_extd,extdinit,extdfcst, & iproj_ext,scale_ext, & trlon_ext,latnot_ext,x0_ext,y0_ext, & lat_ext,lon_ext, & p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, & qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, & tsfc_ext,tsoil_ext, & wetsfc_ext,wetdp_ext,wetcanp_ext,istatus) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! This programs reads coamps2.0 sigma level output ! !----------------------------------------------------------------------- ! ! INPUT: ! dir_extd directory where the coamps files are located ! extdinit Initialized time in mm-dd-yyyy:hh:mm:ss format ! extdfcst Forecast hour in HHH:MM:SS format ! ! OUTPUT: ! ! iproj_ext Map projection number of external data ! scale_ext Scale factor of external data ! trlon_ext True longitude of external data (degrees E) ! latnot_ext(2) True latitude(s) of external data (degrees N) ! x0_ext x coordinate of origin of external data ! y0_ext y coordinate of origin of external data ! lat_ext latitude of external data points (degrees N) ! lon_ext longitude of external data points (degrees E) ! ! p_ext pressure (Pascal) ! hgt_ext height (m) ! t_ext temperature (K) ! tsfc_ext ground/sea-surface temperature (K) ! tsoil_ext Deep soil temperature (K) (in deep 1 m layer) ! wetsfc_ext Surface soil moisture in the top 1 cm layer ! (fraction,0--1.0)) ! wetdp_ext Deep soil moisture in the deep 1 m layer ! wetcanp_ext Canopy water amount ! qv_ext specific humidity(mixing ratio used) (kg/kg) ! qc_ext Cloud water mixing ratio (kg/kg) ! qr_ext Rain water mixing ratio (kg/kg) ! qi_ext Ice mixing ratio (kg/kg) ! qs_ext Snow mixing ratio (kg/kg) ! qh_ext Hail mixing ratio (kg/kg) ! u_ext u wind component (m/s) ! v_ext v wind component (m/s) ! istatus status indicator ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! INTEGER :: nx_ext, ny_ext, nz_ext ! CHARACTER (LEN=60) :: dir_extd CHARACTER (LEN=19) :: extdinit CHARACTER (LEN=9) :: extdfcst CHARACTER (LEN=200) :: FILE,cfile ! ! COAMPS input fields ! REAL :: DATA(500) REAL :: fp(nx_ext,ny_ext,nz_ext),ft(nx_ext,ny_ext,nz_ext), & fq(nx_ext,ny_ext,nz_ext),fu(nx_ext,ny_ext,nz_ext), & fv(nx_ext,ny_ext,nz_ext), & fs(nx_ext,ny_ext),fh(nx_ext,ny_ext), & fsoil(nx_ext,ny_ext),fgwet(nx_ext,ny_ext) ! ! Original grid variables ! INTEGER :: iproj REAL :: scale,trlon,x0,y0 REAL :: latnot(2) ! ! Output external grid variables ! INTEGER :: iproj_ext REAL :: scale_ext,trlon_ext REAL :: latnot_ext(2) REAL :: x0_ext,y0_ext REAL :: x_ext(nx_ext),y_ext(ny_ext) ! ! Output external variable arrays ! REAL :: lat_ext(nx_ext,ny_ext) REAL :: lon_ext(nx_ext,ny_ext) REAL :: p_ext(nx_ext,ny_ext,nz_ext) ! (Pa) REAL :: hgt_ext(nx_ext,ny_ext,nz_ext) ! (m) REAL :: t_ext(nx_ext,ny_ext,nz_ext) ! (K) REAL :: qv_ext(nx_ext,ny_ext,nz_ext) ! (kg/kg) REAL :: u_ext(nx_ext,ny_ext,nz_ext) ! (m/s) REAL :: v_ext(nx_ext,ny_ext,nz_ext) ! (m/s) REAL :: qc_ext(nx_ext,ny_ext,nz_ext) ! Cloud H2O mixing ratio (kg/kg) REAL :: qr_ext(nx_ext,ny_ext,nz_ext) ! Rain H2O mixing ratio (kg/kg) REAL :: qi_ext(nx_ext,ny_ext,nz_ext) ! Ice H2O mixing ratio (kg/kg) REAL :: qs_ext(nx_ext,ny_ext,nz_ext) ! Snow H2O mixing ratio (kg/kg) REAL :: qh_ext(nx_ext,ny_ext,nz_ext) ! Hail H2O mixing ratio (kg/kg) REAL :: tsfc_ext (nx_ext,ny_ext) ! Ground/sea-surface temp. (K) REAL :: tsoil_ext (nx_ext,ny_ext) ! Deep soil temperature (K) REAL :: wetsfc_ext (nx_ext,ny_ext) ! Surface soil moisture (0-1) REAL :: wetdp_ext (nx_ext,ny_ext) ! Deep soil moisture (0-1) REAL :: wetcanp_ext(nx_ext,ny_ext) ! Canopy water amount (0-1) INTEGER :: istatus ! INTEGER :: i,j,k,length_dir PARAMETER(len_dir=60) REAL, ALLOCATABLE :: utmp(:,:), vtmp(:,:) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLOCATE(utmp(nx_ext,ny_ext)) ALLOCATE(vtmp(nx_ext,ny_ext)) !---------------------------------------------------------------------- ! Open and read the COAMPS file: ! data--header file, fp--pressure (mb), ft--potential temp (K) ! fq--water vapor mixing ratio (kg/kg), fu and fv -- wind (m/s) ! fs--surface temp (K), fh--terrain height (m) !---------------------------------------------------------------------- length_dir = len_dir CALL strlnth(dir_extd, length_dir) cfile = dir_extd(1:length_dir)//extdinit//'+'//extdfcst PRINT *, 'Open coamps file= ', cfile OPEN(4,FILE=cfile, STATUS='old',FORM='unformatted') READ(4) DATA,fp,ft,fq,fu,fv,fs,fsoil,fgwet,fh ! !----------------------------------------------------------------------- ! ! Get the COAMPS grid configurations ! In COAMPS 1=mercator, 2=lambert, 3=polar projection. ! !----------------------------------------------------------------------- ! iproj_ext = INT(DATA(3)) IF(iproj_ext == 1) THEN iproj_ext=3 ELSE IF(iproj_ext == 3) THEN iproj_ext=1 ELSE IF(iproj_ext > 3) THEN PRINT *, 'can not handle this projection', iproj_ext STOP END IF latnot_ext(1) = DATA(4) latnot_ext(2) = DATA(5) trlon_ext = DATA(6)-360.0 scale_ext = 1.0 swlat_ext = DATA(36) swlon_ext = DATA(37)-360.0 dx_ext = DATA(9) dy_ext = DATA(10) ! !----------------------------------------------------------------------- ! ! Get the lat,lon of the COAMPS grid points ! !----------------------------------------------------------------------- ! CALL getmapr(iproj,scale,latnot,trlon,x0,y0) CALL setmapr(iproj_ext,scale_ext,latnot_ext,trlon_ext) CALL lltoxy(1,1,swlat_ext,swlon_ext,x0_ext,y0_ext) ! DO i=1,nx_ext x_ext(i)=x0_ext+(i-1)*dx_ext END DO DO j=1,ny_ext y_ext(j)=y0_ext+(j-1)*dy_ext END DO CALL xytoll(nx_ext,ny_ext,x_ext,y_ext,lat_ext,lon_ext) ! PRINT *, ' maps point 34,17: ',lat_ext(34,17),lon_ext(34,17) PRINT *, ' maps point nx,ny: ',lat_ext(nx_ext,ny_ext), & lon_ext(nx_ext,ny_ext) ! !----------------------------------------------------------------------- ! ! Get the COAMPS data ! !----------------------------------------------------------------------- ! DO k=1,nz_ext nk=nz_ext-k+1 DO j=1,ny_ext DO i=1,nx_ext hgt_ext(i,j,nk)= DATA(200+k)*(DATA(201)-fh(i,j))/DATA(201) & +fh(i,j) END DO END DO END DO DO k=1,nz_ext nk=nz_ext-k+1 DO j=1,ny_ext DO i=1,nx_ext p_ext(i,j,nk)= fp(i,j,k)*100.0 t_ext(i,j,nk)= ft(i,j,k)*(fp(i,j,k)/1000.0)**0.286 qv_ext(i,j,nk) = fq(i,j,k) u_ext(i,j,nk) = fu(i,j,k) v_ext(i,j,nk) = fv(i,j,k) END DO END DO END DO DO j=1,ny_ext DO i=1,nx_ext tsfc_ext (i,j) = fs(i,j) tsoil_ext (i,j) = fsoil(i,j) wetsfc_ext(i,j) = fgwet(i,j) wetdp_ext (i,j) = fgwet(i,j) !assumed value!!!!!!!!!!!!!!!! wetcanp_ext(i,j)= 0.0 !assumed value!!!!!!!!!!!!!!!! END DO END DO ! !----------------------------------------------------------------------- ! ! Fill qc,qr,qi,qs,qh arrays with missing value. ! !----------------------------------------------------------------------- ! DO k=1,nz_ext DO j=1,ny_ext DO i=1,nx_ext qc_ext(i,j,k)=-999. qr_ext(i,j,k)=-999. qi_ext(i,j,k)=-999. qs_ext(i,j,k)=-999. qh_ext(i,j,k)=-999. END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Rotate winds to be relative to true north. ! The COAMPS data are saved as grid-relative. ! !----------------------------------------------------------------------- ! DO k=1,nz_ext !2001-05-16 GMB: Having umap & uear (or vmap & vear) point to !the same array causes numerical errors when optimizing. CALL uvmptoe(nx_ext,ny_ext,u_ext(1,1,k),v_ext(1,1,k), & lon_ext,utmp,vtmp) u_ext(:,:,k) = utmp(:,:) v_ext(:,:,k) = vtmp(:,:) END DO ! ! test: print out ! ! print *, 'iproj_ext,swlat_ext,swlon_ext,scale_ext,trlon_ext, ! : latnot_ext(1),latnot_ext(2),lat_ext(1),lon_ext(1),dx_ext.dy_ext' ! write(6,'(i3,10f12.4)') iproj_ext,swlat_ext,swlon_ext, ! : scale_ext,trlon_ext,latnot_ext(1),latnot_ext(2), ! : lat_ext(1,1),lon_ext(1,1),dx_ext,dy_ext ! do 666 k=1,nz_ext ! print *, 'k,p,t,q,u,v,s,h' ! write(6,'(i3,6f12.4)') ! : k,p_ext(20,20,k),t_ext(20,20,k),qv_ext(20,20,k), ! : u_ext(20,20,k),v_ext(20,20,k), ! : tsfc_ext(20,20) !666 continue ! !----------------------------------------------------------------------- ! ! Reset map projection to previous values ! !----------------------------------------------------------------------- ! CALL setmapr(iproj,scale,latnot,trlon) CALL setorig(1,x0,y0) ! !----------------------------------------------------------------------- ! ! Set good status ! !----------------------------------------------------------------------- ! istatus=1 CLOSE(4) DEALLOCATE(utmp) DEALLOCATE(vtmp) RETURN END SUBROUTINE getcoamps