!----------------------------------------------------------------------- subroutine imf15m (iyr,ndata,date,bx,by,bz,swvel,swden) ! ! Dec 2011 Barbara Emery: imf15m to read yearly netcdf (.nc) file of 15 min ! OMNI IMF data every 5 min where t=0 uses averages from t=-20 to -5 min ! (recommended by Daniel Weimer). ! include "/opt/local/include/netcdf.inc" character*47 omnifile integer :: iy4 real :: missing real :: date(ndata),bx(ndata),by(ndata),bz(ndata),swvel(ndata),swden(ndata) missing = -9999. !??? missing value in imf_OMNI 5-min 15min av files iy4 = iyr/4 iend = 365 if (iyr .eq. iy4*4) iend = 366 write (omnifile,"('/hao/aim3/tgcm/data/imf_OMNI_',i4,'001-',i4,i3.3,'.nc')") iyr,iyr,iend istat = nf_open(omnifile,NF_NOWRITE,ncid) if (istat /= NF_NOERR) then write(6,"('Error opening imf_ncfile ',a)")trim(omnifile) stop endif write(6,"(/,72('-'))") write(6,"('RDIMF: read IMF data file:')") write(6,"('Opened netcdf imf data file ',a)") trim(omnifile) ! Get ndata and ndays dimensions: istat = nf_inq_dimid(ncid,'ndata',id_ndata) istat = nf_inq_dimlen(ncid,id_ndata,ndata) write(6,"('rdimf: ndata=',i5)") ndata ! istat = nf_inq_dimid(ncid,'ndays',id_ndays) ! istat = nf_inq_dimlen(ncid,id_ndays,ndays) ! write(6,"('rdimf: ndata=',i5,' ndays=',i5)") ndata,ndays ! Allocate data arrays and initialize structure pointers: ! call alloc_imf ! yyyyddd.frac date: istat = nf_inq_varid(ncid,'date',idv_date) istat = nf_get_var_double(ncid,idv_date,date) write(6,"('rdimf: date min,max=',2f14.4)") minval(date),maxval(date) ! bx: istat = nf_inq_varid(ncid,'bx',idv_bx) istat = nf_get_var_double(ncid,idv_bx,bx) call fminmaxspv(bx,ndata,fmin,fmax,missing) write(6,"('rdimf: bx min,max=',2f8.2)") fmin,fmax ! by: istat = nf_inq_varid(ncid,'by',idv_by) istat = nf_get_var_double(ncid,idv_by,by) call fminmaxspv(by,ndata,fmin,fmax,missing) write(6,"('rdimf: by min,max=',2f8.2)") fmin,fmax ! bz: istat = nf_inq_varid(ncid,'bz',idv_bz) istat = nf_get_var_double(ncid,idv_bz,bz) call fminmaxspv(bz,ndata,fmin,fmax,missing) write(6,"('rdimf: bz min,max=',2f8.2)") fmin,fmax ! swvel: istat = nf_inq_varid(ncid,'swvel',idv_swvel) istat = nf_get_var_double(ncid,idv_swvel,swvel) call fminmaxspv(swvel,ndata,fmin,fmax,missing) write(6,"('rdimf: swvel min,max=',2f8.2)") fmin,fmax ! swden: istat = nf_inq_varid(ncid,'swden',idv_swden) istat = nf_get_var_double(ncid,idv_swden,swden) call fminmaxspv(swden,ndata,fmin,fmax,missing) write(6,"('rdimf: swden min,max=',2f8.2)") fmin,fmax write(6,"(72('-'),/)") end subroutine imf15m !----------------------------------------------------------------------- ! subroutine alloc_imf ! real,dimension(:),target,allocatable :: ! uttime,yfrac,bx,by,bz,swvel,swden,kp,f107d,f107a ! integer :: istat ! allocate(date(ndata),stat=istat) ! allocate(uttime(ndata),stat=istat) ! allocate(yfrac(ndata),stat=istat) ! allocate(bx(ndata),stat=istat) ! allocate(by(ndata),stat=istat) ! allocate(bz(ndata),stat=istat) ! allocate(swvel(ndata),stat=istat) ! allocate(swden(ndata),stat=istat) ! allocate(kp(ndata),stat=istat) ! allocate(days(ndays),stat=istat) ! allocate(f107d(ndays),stat=istat) ! allocate(f107a(ndays),stat=istat) ! end subroutine alloc_imf !----------------------------------------------------------------------- subroutine fminmaxspv(f,n,fmin,fmax,spv) implicit none ! ! Return min and max of fields f(n) (between -1.e36,+1.e36) ! Ignore any f(i)==spv. ! ! Args: integer,intent(in) :: n real,intent(in) :: f(n),spv real,intent(out) :: fmin,fmax ! ! Local: integer :: i ! fmin = 1.e36 fmax = -1.e36 do i=1,n if (f(i) /= spv) then fmin = min(f(i),fmin) fmax = max(f(i),fmax) endif enddo end subroutine fminmaxspv !-------------------------------------------------------------------