program toaltreg c c Program to create/update a data base for altimeter data c c Each ERM is stored in a separate file. c c Ole B. Andersen, Marts, 6 1992 c implicit none logical lfirst,lsame character*72 ofile,ofile2,ifile,if1,if2,if3,if4,if5,if6 integer*4 lwrd(7),gdr_size,ios integer*4 j1986,j1991,j2000 parameter (j1986=31536000,j1991=189302400,j2000=473299200) c c Altimeter data are stored 'seqentially' on a direct access c file. c A catalogue and a key in each record describe how data inside c subareas are found. The catalogue are stored in the beginning c of the file together with: c c nlngth length of reg.file in records c ntotal total number of data c nhead length of headder in records c time1 start time of data c time2 end time of data c irev1 first revolution number c irev2 last revolution number c ilat0 lower latitude bound of area c ilon0 lower longitude bound of area c idlat size in latitude of subareas c idlon size in longitude of subareas c idimi number of subareas in latitude c idimj number of subareas in longitude c c The catalogue contains for subarea (i,j) c c istore(1,i,j) first record c istore(2,i,j) last record c istore(3,i,j) number of records in subarea c real*8 time1,time2,t1,t2,a1,a2,b1,b2,drad,pbar,swh,pcor,dlat integer*4 irev1,irev2,ireg,irec,jrec,ntotal,nhead,jrev integer*4 idimi,idimj,idlat,idlon,iarea,iarea0,jarea,jarea0 integer*4 ilat1,ilat2,ilon1,ilon2,i,j,k,i1,i2,j1,j2 integer*4 istore(3,34,36),ndat,nlngth c c Description of data record: c c time time in seconds from the beginning of 1985 c ilat latitude c ilon longitude c issh sea surface height after orbit and geophys. corr. c ire revolution number of track c igeoid present geoid model ?? OSU91A c icorr =The sum of (dry+wet troposphere+ c ionosphere+solid earth )units mm c Data removed if any of these >32000 c next number of next record inside sub-area c (=0: end) c real*8 time,basetime,revtime,cycletime real*4 geoid,depth,corr,dpt,dist,etide,alat,alon,assh,astd real*4 begm integer*4 ilat,ilat0,ilon0,ilon,next,next2,iorbit integer*2 issh,igeoid,idepth,imssh,ifree integer*2 istd,icorr,itide,itideold integer*2 iswh,iwind,irev,iembias,in integer*2 iiono,idry,iwet,inb,iswind,isswh,isolid integer*2 ietide1,iotide1,ietide,ietide2,ietide3,invbar,iload integer*2 iflag_esa,iflag_noaa,ih_uncor,idist,idpt integer*2 i2scr(19),i2rec(19) equivalence (i2rec(1),time), . (i2rec(5),ilat), . (i2rec(7),ilon), . (i2rec(9),issh), . (i2rec(10),imssh), . (i2rec(11),igeoid), . (i2rec(12),idepth), . (i2rec(13),next), . (i2rec(15),istd), . (i2rec(16),irev), . (i2rec(17),ietide), . (i2rec(18),idist), . (i2rec(19),idpt), . (i2scr(13),next2) drad = 3.1415936d0/ 180.0d0 c write(*,*) 'Input: GDR file, binary out 1,2,' read(*,490) ifile read(*,490) ofile 490 format(a72) write(*,495) ifile,ofile 495 format(/,' Program: input file: ',a44,/, . ' reg. file: ',a44,//) open(10,file=ifile,status='old') open(12,file=ofile,access='direct',recl=38,status='new') open(13,file='dummy.bin',access='direct',recl=38,status='new') c geoide,dybde,otide1,dist lfirst=.true. ilat0= -85000000 ilon0=-180000000 idlat= 5000000 idlon=10000000 idimi=34 idimj=36 do 5 i=1,idimi do 5 j=1,idimj do 5 k=1,3 istore(k,i,j)=0 5 continue nhead=idimi*idimj+2 ntotal=0 c i=0 irec=nhead+ntotal write(*,*) irec ilat1=ilat0+idimi*idlat ilon1=ilon0+idimj*idlon iarea0=-999 jarea0=-999 time1=1.0d10 time2=-1.0d10 irev1=100000 irev2=0 ireg = 1226 write(*,*) 'ready' 10 ireg = ireg + 1 c reading files....... read(10,*,err=999,end=999) . irev,alat,alon,time,issh,imssh, . igeoid,idepth,istd,irev,itide,idist,iswh if (alon.gt.180) alon = alon - 360.0 ilat = int(1000000*alat) ilon = int(1000000*alon) c itideold = itide ietide = itide c if (abs(ietide).gt.9000) then c ietide = 32767 c etide = 0.0 c end if c if (abs(ietide).lt.30000) then c issh = issh + itideold - ietide c end if if (mod(ireg,100000).eq.1) then write(*,*) ireg write(*,*) 'time,ilat,ilon,irev,issh,istd,igeoid,imssh' write(*,*) time,ilat,ilon,irev,issh,istd,igeoid,imssh write(*,*) 'TIdes: issh,irev,igeoid,ietide3,idist,idpt' write(*,*) issh,irev,igeoid,ietide,idist,idpt end if if (time.gt.time2) time2 = time if (time.lt.time1) time1 = time if(irev.lt.irev1) irev1=irev if(irev.gt.irev2) irev2=irev c iarea=(ilat-ilat0)/idlat+1 jarea=(ilon-ilon0)/idlon+1 if(iarea.lt.1.or.iarea.gt.idimi.or. . jarea.lt.1.or.jarea.gt.idimj) go to 10 c irec=irec+1 next=irec+1 c lsame=iarea.eq.iarea0.and.jarea.eq.jarea0 if(.not.lsame) then if(istore(1,iarea,jarea).eq.0) then istore(1,iarea,jarea)=irec else jrec=istore(2,iarea,jarea) read(12,rec=jrec) i2scr next2=irec write(12,rec=jrec) i2scr endif endif c istore(2,iarea,jarea)=irec istore(3,iarea,jarea)=istore(3,iarea,jarea)+1 write(12,rec=irec) i2rec iarea0=iarea jarea0=jarea c write(*,*) irec go to 10 999 continue write(*,*) 'Finish reading ireg is now :',ireg write(*,*) 'Finish reading',irec,nhead,ntotal ndat=irec-ntotal-nhead ntotal=ntotal+ndat c write(*,505) ndat,ntotal,time1,time2,irev1,irev2 505 format(' number of altimeter data added to reg.:',i8,/, . ' now containing a total number:',i8,/, . ' start and end times:',2f16.1,' sec.s (1985)',/ . ' -do- rev.s:',2(8x,i8),//, . ' Status of subareas:',//, . ' latitude longitude', . ' first and last rec. ndat',/) jrec=1 nlngth=ntotal+nhead write(12,rec=jrec) nlngth,ntotal,nhead,time1,time2,irev1,irev2 write(13,rec=jrec) nlngth,ntotal,nhead,time1,time2,irev1,irev2 jrec=2 write(12,rec=jrec) ilat0,ilon0,idlat,idlon,idimi,idimj write(13,rec=jrec) ilat0,ilon0,idlat,idlon,idimi,idimj do 1000 i=1,idimi do 1000 j=1,idimj jrec=jrec+1 write(12,rec=jrec)(istore(k,i,j),k=1,3) write(13,rec=jrec)(istore(k,i,j),k=1,3) i2=ilat0+i*idlat i1=i2-idlat j2=ilon0+j*idlon j1=j2-idlon a1=i1/1000000.0 a2=i2/1000000.0 b1=j1/1000000.0 b2=j2/1000000.0 write(*,510) a1,a2,b1,b2,(istore(k,i,j),k=1,3) c c set 'next record' to zero in last record c if(istore(2,i,j).gt.0) then read(12,rec=istore(2,i,j)) i2rec next=0 write(12,rec=istore(2,i,j)) i2rec write(13,rec=istore(2,i,j)) i2rec endif 510 format(4f10.4,3i8) 1000 continue 1300 continue close(10) close(20) end