Blame | Last modification | View Log | Download | RSS feed
PROGRAM coastlinec *********************************************************************c * Add the coastline and land sea mask to the REF file *c * Michael Sprenger / Winter 2006,07 *c *********************************************************************implicit nonec --------------------------------------------------------------------c Declaration of parameters and variablesc --------------------------------------------------------------------c Input parameterscharacter*80 coastfilecharacter*80 reffilereal clon,clat,crotc Output arraysinteger nmaxparameter (nmax=100000)real,allocatable, dimension (:,:) :: landseareal,allocatable, dimension (:,:) :: xcor,ycorreal xpos(nmax),ypos(nmax)real lon(nmax), lat(nmax)real rlon(nmax),rlat(nmax)integer ncoastinteger rnx,rnyreal rxmin,rymin,rxmax,rymaxreal rdx,rdyc Auxiliary variablesinteger i,jcharacter*80 nameinteger cdfid,cstidcharacter*80 cfninteger ierr,statcharacter*80 varnamereal varmin(4),varmax(4),stag(4)integer vardim(4),ndimreal mdvinteger isokinteger nvarsinteger ntimesreal timecharacter*80 vnam(100)c --------------------------------------------------------------------c Preparationsc --------------------------------------------------------------------print*,'*********************************************************'print*,'* coastline *'print*,'*********************************************************'c Read parameter fileopen(10,file='fort.10')read(10,*) reffileread(10,*) coastfileread(10,*) name,clonif ( trim(name).ne.'CLON' ) stopread(10,*) name,clatif ( trim(name).ne.'CLAT' ) stopread(10,*) name,crotif ( trim(name).ne.'CROT' ) stopclose(10)print*print*,trim(reffile)print*,trim(coastfile)print*,clon,clat,crotc Read grid parameterscall cdfopn(reffile,cdfid,ierr)if (ierr.ne.0) goto 998call getvars(cdfid,nvars,vnam,ierr)if (ierr.ne.0) goto 998varname='X'call getdef(cdfid,varname,ndim,mdv,vardim,> varmin,varmax,stag,ierr)if (ierr.ne.0) goto 998call gettimes(cdfid,time,ntimes,ierr)if (ierr.ne.0) goto 998call clscdf(cdfid,ierr)rnx=vardim(1)rny=vardim(2)rxmin=varmin(1)rymin=varmin(2)rxmax=varmax(1)rymax=varmax(2)rdx=(rxmax-rxmin)/real(rnx-1)rdy=(rymax-rymin)/real(rny-1)c Allocate memoryallocate(landsea(rnx,rny),stat=stat)if (stat.ne.0) print*,'*** error allocating array landsea ***'allocate(xcor(rnx,rny),stat=stat)if (stat.ne.0) print*,'*** error allocating array xcor ***'allocate(ycor(rnx,rny),stat=stat)if (stat.ne.0) print*,'*** error allocating array ycor ***'c Read datacall cdfopn(reffile,cdfid,ierr)if (ierr.ne.0) goto 998varname='X'call getdat(cdfid,varname,time,1,xcor,ierr)if (ierr.ne.0) goto 998varname='Y'call getdat(cdfid,varname,time,1,ycor,ierr)if (ierr.ne.0) goto 998call clscdf(cdfid,ierr)c Read the coastfileopen(10,file=coastfile)ncoast=1100 read(10,*,end=200) lon(ncoast),lat(ncoast)ncoast=ncoast+1goto 100200 close(10)ncoast=ncoast-1c Handle missing data valuesmdv=-100000.do i=ncoast,nmaxlon(i)=mdvlat(i)=mdvenddoc --------------------------------------------------------------------c Transform coast(lat/lon) to coast(x/y)c --------------------------------------------------------------------call getenvir (clon,clat,crot,> xcor,ycor,rnx,rny,rxmin,rymin,rdx,rdy,mdv,> lon,lat,rlon,rlat,xpos,ypos,nmax)c --------------------------------------------------------------------c Write outputc --------------------------------------------------------------------c Open output file and set some general parameterscall cdfwopn(reffile,cdfid,ierr)if (ierr.ne.0) goto 998vardim(1)=1vardim(2)=1vardim(3)=nmaxndim=3c Write LATisok=0varname='COAST_LAT'call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) thencall putdef(cdfid,varname,ndim,mdv,vardim,> varmin,varmax,stag,ierr)if (ierr.ne.0) goto 998endifcall putdat(cdfid,varname,time,0,lat,ierr)if (ierr.ne.0) goto 998print*,'W ',trim(varname),' ',trim(reffile)c Write LONisok=0varname='COAST_LON'call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) thencall putdef(cdfid,varname,ndim,mdv,vardim,> varmin,varmax,stag,ierr)if (ierr.ne.0) goto 998endifcall putdat(cdfid,varname,time,0,lon,ierr)if (ierr.ne.0) goto 998print*,'W ',trim(varname),' ',trim(reffile)c Write RLATisok=0varname='COAST_RLAT'call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) thencall putdef(cdfid,varname,ndim,mdv,vardim,> varmin,varmax,stag,ierr)if (ierr.ne.0) goto 998endifcall putdat(cdfid,varname,time,0,rlat,ierr)if (ierr.ne.0) goto 998print*,'W ',trim(varname),' ',trim(reffile)c Write RLONisok=0varname='COAST_RLON'call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) thencall putdef(cdfid,varname,ndim,mdv,vardim,> varmin,varmax,stag,ierr)if (ierr.ne.0) goto 998endifcall putdat(cdfid,varname,time,0,rlon,ierr)if (ierr.ne.0) goto 998print*,'W ',trim(varname),' ',trim(reffile)c Write Yisok=0varname='COAST_Y'call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) thencall putdef(cdfid,varname,ndim,mdv,vardim,> varmin,varmax,stag,ierr)if (ierr.ne.0) goto 998endifcall putdat(cdfid,varname,time,0,ypos,ierr)if (ierr.ne.0) goto 998print*,'W ',trim(varname),' ',trim(reffile)c Write Xisok=0varname='COAST_X'call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) thencall putdef(cdfid,varname,ndim,mdv,vardim,> varmin,varmax,stag,ierr)if (ierr.ne.0) goto 998endifcall putdat(cdfid,varname,time,0,xpos,ierr)if (ierr.ne.0) goto 998print*,'W ',trim(varname),' ',trim(reffile)c Close output filecall clscdf(cdfid,ierr)if (ierr.ne.0) goto 998c --------------------------------------------------------------------c Exception handlingc --------------------------------------------------------------------stop998 print*,'Problems with input netcdf file'stopENDc --------------------------------------------------------------------------------c Subroutine to get environment of strcofc --------------------------------------------------------------------------------SUBROUTINE getenvir (clon,clat,rotation,> xcor,ycor,rnx,rny,rxmin,rymin,rdx,rdy,mdv,> lon,lat,rlon,rlat,xpos,ypos,n)c Rotate from a local quasi-cartesian coordiante system into lat/lon coordinatec system.implicit nonec Declaration of input and output parametersinteger nreal clon,clat,rotationreal lon(n), lat(n)real rlon(n),rlat(n)real xpos(n),ypos(n)integer rnx,rnyreal xcor(rnx,rny),ycor(rnx,rny)real rxmin,rymin,rdx,rdyreal mdvc Set numerical and physical constantsreal g2rparameter (g2r=0.0174533)real pi180parameter (pi180=3.14159265359/180.)real epsparameter (eps=0.0001)c Auxiliary variablesreal pollon,pollatinteger i,jreal xind,yindreal rindx,rindyinteger indx,indy,indr,indureal frac0i,frac0j,frac1i,frac1jreal rlon1(n),rlat1(n)c Externalsreal lmtolms,phtophsexternal lmtolms,phtophsc First rotationpollon=clon-180.if (pollon.lt.-180.) pollon=pollon+360.pollat=90.-clatdo i=1,nif ( (abs(lon(i)-mdv).gt.eps).and.> (abs(lat(i)-mdv).gt.eps) ) thenc First rotationpollon=clon-180.if (pollon.lt.-180.) pollon=pollon+360.pollat=90.-clatrlon1(i)=lmtolms(lat(i),lon(i),pollat,pollon)rlat1(i)=phtophs(lat(i),lon(i),pollat,pollon)c Second coordinate transformationpollon=-180.pollat=90.+rotationrlon(i)=90.+lmtolms(rlat1(i),rlon1(i)-90.,pollat,pollon)rlat(i)=phtophs(rlat1(i),rlon1(i)-90.,pollat,pollon)c Get rotated latitude and longitude100 if (rlon(i).lt.rxmin) thenrlon(i)=rlon(i)+360.goto 100endif102 if (rlon(i).gt.(rxmin+real(rnx-1)*rdx)) thenrlon(i)=rlon(i)-360.goto 102endifif ( (rlon(i).lt.rxmin).or.> (rlon(i).gt.(rxmin+real(rnx-1)*rdx)).or.> (rlat(i).lt.rymin).or.> (rlat(i).gt.(rymin+real(rny-1)*rdy)) ) thenrlon(i)=mdvrlat(i)=mdvendifc Get x and y coordinatesrindx=(rlon(i)-rxmin)/rdx+1.rindy=(rlat(i)-rymin)/rdy+1.indx=int(rindx)indy=int(rindy)if ((indx.gt.1).and.(indx.lt.rnx).and.> (indy.gt.1).and.(indy.lt.rny)) thenindr=indx+1if (indr.gt.rnx) indr=1indu=indy+1if (indu.gt.rny) indu=rnyfrac0i=rindx-float(indx)frac0j=rindy-float(indy)frac1i=1.-frac0ifrac1j=1.-frac0jxpos(i) = xcor(indx ,indy) * frac1i * frac1j& + xcor(indx ,indu) * frac1i * frac0j& + xcor(indr ,indy) * frac0i * frac1j& + xcor(indr ,indu) * frac0i * frac0jypos(i) = ycor(indx ,indy) * frac1i * frac1j& + ycor(indx ,indu) * frac1i * frac0j& + ycor(indr ,indy) * frac0i * frac1j& + ycor(indr ,indu) * frac0i * frac0jelsexpos(i)=mdvypos(i)=mdvendifelserlon(i)=mdvrlat(i)=mdvxpos(i)=mdvypos(i)=mdvendifenddoENDc --------------------------------------------------------------------------------c Transformation routine: LMSTOLM and PHSTOPH from library gm2emc --------------------------------------------------------------------------------REAL FUNCTION LMTOLMS (PHI, LAM, POLPHI, POLLAM)CC%Z% Modul %M%, V%I% vom %G%, extrahiert am %H%CC**** LMTOLMS - FC:UMRECHNUNG DER WAHREN GEOGRAPHISCHEN LAENGE LAMC**** AUF EINEM PUNKT MIT DEN KOORDINATEN (PHIS, LAMS)C**** IM ROTIERTEN SYSTEM. DER NORDPOL DES SYSTEMS HATC**** DIE WAHREN KOORDINATEN (POLPHI, POLLAM)C** AUFRUF : LAM = LMTOLMS (PHI, LAM, POLPHI, POLLAM)C** ENTRIES : KEINEC** ZWECK : UMRECHNUNG DER WAHREN GEOGRAPHISCHEN LAENGE LAM AUFC** EINEM PUNKT MIT DEN KOORDINATEN (PHIS, LAMS) IMC** ROTIERTEN SYSTEM. DER NORDPOL DIESES SYSTEMS HATC** DIE WAHREN KOORDINATEN (POLPHI, POLLAM)C** VERSIONS-C** DATUM : 03.05.90C**C** EXTERNALS: KEINEC** EINGABE-C** PARAMETER: PHI REAL BREITE DES PUNKTES IM GEOGR. SYSTEMC** LAM REAL LAENGE DES PUNKTES IM GEOGR. SYSTEMC** POLPHI REAL GEOGR.BREITE DES N-POLS DES ROT. SYSTEMSC** POLLAM REAL GEOGR.LAENGE DES N-POLS DES ROT. SYSTEMSC** AUSGABE-C** PARAMETER: WAHRE GEOGRAPHISCHE LAENGE ALS WERT DER FUNKTIONC** ALLE WINKEL IN GRAD (NORDEN>0, OSTEN>0)C**C** COMMON-C** BLOECKE : KEINEC**C** FEHLERBE-C** HANDLUNG : KEINEC** VERFASSER: G. DE MORSIERREAL LAM,PHI,POLPHI,POLLAMDATA ZRPI18 , ZPIR18 / 57.2957795 , 0.0174532925 /ZSINPOL = SIN(ZPIR18*POLPHI)ZCOSPOL = COS(ZPIR18*POLPHI)ZLAMPOL = ZPIR18*POLLAMZPHI = ZPIR18*PHIZLAM = LAMIF(ZLAM.GT.180.0) ZLAM = ZLAM - 360.0ZLAM = ZPIR18*ZLAMZARG1 = - SIN(ZLAM-ZLAMPOL)*COS(ZPHI)ZARG2 = - ZSINPOL*COS(ZPHI)*COS(ZLAM-ZLAMPOL)+ZCOSPOL*SIN(ZPHI)IF (ABS(ZARG2).LT.1.E-30) THENIF (ABS(ZARG1).LT.1.E-30) THENLMTOLMS = 0.0ELSEIF (ZARG1.GT.0.) THENLMTOLMS = 90.0ELSELMTOLMS = -90.0ENDIFELSELMTOLMS = ZRPI18*ATAN2(ZARG1,ZARG2)ENDIFRETURNENDREAL FUNCTION PHTOPHS (PHI, LAM, POLPHI, POLLAM)CC%Z% Modul %M%, V%I% vom %G%, extrahiert am %H%CC**** PHTOPHS - FC:UMRECHNUNG DER WAHREN GEOGRAPHISCHEN BREITE PHIC**** AUF EINEM PUNKT MIT DEN KOORDINATEN (PHIS, LAMS)C**** IM ROTIERTEN SYSTEM. DER NORDPOL DES SYSTEMS HATC**** DIE WAHREN KOORDINATEN (POLPHI, POLLAM)C** AUFRUF : PHI = PHTOPHS (PHI, LAM, POLPHI, POLLAM)C** ENTRIES : KEINEC** ZWECK : UMRECHNUNG DER WAHREN GEOGRAPHISCHEN BREITE PHI AUFC** EINEM PUNKT MIT DEN KOORDINATEN (PHIS, LAMS) IMC** ROTIERTEN SYSTEM. DER NORDPOL DIESES SYSTEMS HATC** DIE WAHREN KOORDINATEN (POLPHI, POLLAM)C** VERSIONS-C** DATUM : 03.05.90C**C** EXTERNALS: KEINEC** EINGABE-C** PARAMETER: PHI REAL BREITE DES PUNKTES IM GEOGR. SYSTEMC** LAM REAL LAENGE DES PUNKTES IM GEOGR. SYSTEMC** POLPHI REAL GEOGR.BREITE DES N-POLS DES ROT. SYSTEMSC** POLLAM REAL GEOGR.LAENGE DES N-POLS DES ROT. SYSTEMSC** AUSGABE-C** PARAMETER: ROTIERTE BREITE PHIS ALS WERT DER FUNKTIONC** ALLE WINKEL IN GRAD (NORDEN>0, OSTEN>0)C**C** COMMON-C** BLOECKE : KEINEC**C** FEHLERBE-C** HANDLUNG : KEINEC** VERFASSER: G. DE MORSIERREAL LAM,PHI,POLPHI,POLLAMDATA ZRPI18 , ZPIR18 / 57.2957795 , 0.0174532925 /ZSINPOL = SIN(ZPIR18*POLPHI)ZCOSPOL = COS(ZPIR18*POLPHI)ZLAMPOL = ZPIR18*POLLAMZPHI = ZPIR18*PHIZLAM = LAMIF(ZLAM.GT.180.0) ZLAM = ZLAM - 360.0ZLAM = ZPIR18*ZLAMZARG = ZCOSPOL*COS(ZPHI)*COS(ZLAM-ZLAMPOL) + ZSINPOL*SIN(ZPHI)PHTOPHS = ZRPI18*ASIN(ZARG)RETURNENDc ----------------------------------------------------------------c Check whether variable is found on netcdf filec ----------------------------------------------------------------subroutine check_varok (isok,varname,varlist,nvars)c Check whether the variable <varname> is in the list <varlist(nvars)>.c If this is the case, <isok> is incremented by 1. Otherwise <isok>c keeps its value.implicit nonec Declaraion of subroutine parametersinteger isokinteger nvarscharacter*80 varnamecharacter*80 varlist(nvars)c Auxiliary variablesinteger ic Maindo i=1,nvarsif (trim(varname).eq.trim(varlist(i))) isok=isok+1enddoend