subroutine read_grid(iunit,a,ni,nj,istat) dimension a(ni,nj) istat=1 read(iunit,err=800) a go to 999 800 continue istat=0 999 continue return end subroutine write_grid(iunit,a,ni,nj) dimension a(ni,nj) write(iunit) a return end subroutine sfc_area(fld,rlon,rlat,undef,ni,nj, $ area,iunit_diag) dimension fld(ni,nj),rlat(nj+1),rlon(ni+1), $ area(ni,nj) deg2rad=3.14115926/180.0 do j=1,nj do i=1,ni dlon=(rlon(i+1)-rlon(i))*deg2rad dlat=sin(rlat(j+1)*deg2rad)-sin(rlat(j)*deg2rad) area(i,j)=dlon*dlat if(fld(i,j).eq.undef) area(i,j)=0.0 end do rlatout=(rlat(j+1)+rlat(j))*0.5 cccc write(iunit_diag,*) 'j = ',j,' sfc area = ',rlatout,area(1,j) end do return end subroutine trim_grid(a,ni,niinew,nj,dum) dimension a(ni,nj),dum(niinew,nj) do j=1,nj do i=1,niinew dum(i,j)=a(i,j) end do end do return end subroutine fix_grid(a,ni,nj) dimension a(ni,nj) do i=1,ni do j=1,nj a(i,j)=i+j end do end do return end subroutine qprntu(a,qtitle,undef, $ ibeg,jbeg,m,n,iskip,iunit) C C---------------------------------------------------------------- C C version of qprntn which handles undefined values C by having them printed as **** C C Mike Fiorino, NMC Development Division C C---------------------------------------------------------------- C C C a= fwa of m x n array C qtitle - title C ibeg,jbeg=lower left corner coords to be printed C up to 43 x 83 points printed c dimension a(m,n),ix(81) character qtitle*24 c c determine grid limits c if(iskip.eq.0) iskip=1 iend=min0(ibeg+79*iskip,m) jend=min0(jbeg+79*iskip,n) c 24 continue c c index backwards checking for max c 11 xm=0. jendsc=min0(jend,n) do j=jbeg,jendsc,iskip jend_qp = j do i=ibeg,iend,iskip xmax=abs(a(i,j)) if(a(i,j).eq.undef) xmax=0.0 xm=amax1(xm,xmax) end do end do c c determine scaling factor limits c if(xm.lt.1.0e-32.or.xm.eq.0.0) xm=99.0 xm=alog10(99.0/xm) kp=xm if(xm.lt.0.0)kp=kp-1 c c print scaling constants c 12 write(iunit,1) qtitle,kp,iskip,(i,i=ibeg,iend,2*iskip) 1 format('0',a,' k=',i3,' iskip=',i2,/,' ',41i6) fk=10.0**kp c c quickprint field c do 2 jli=jend_qp,jbeg,-iskip ii= 0 if(kp.eq.0) then do i=ibeg,iend,iskip ii=ii+1 if(a(i,jli).eq.undef) then ix(ii)=999999 else ix(ii)=a(i,jli)+sign(.5,a(i,jli)) endif end do else do i=ibeg,iend,iskip ii=ii+1 if(a(i,jli).eq.undef) then ix(ii)=999999 else ix(ii)=a(i,jli)*fk+sign(.5,a(i,jli)) endif end do end if write(iunit,'(i4,81i3)') jli,(ix(i),i=1,ii),jli 2 continue return end subroutine vload2(a,b,ni,nj) dimension a(ni,nj),b(ni,nj) do j=1,nj do i=1,ni a(i,j)=b(i,j) end do end do return end c c$$$ subprogram documentation block c . . . . c subprogram: gaulat calculates gaussian grid latitudes c prgmmr: s. j. lord org: w/nmc22 date: 91-06-06 c c abstract: calculates gaussian grid latitudes c c program history log: c 91-06-06 s. j. lord - copied from kanamitsu library c 930921 m.fiorino - changed from colatitude to latitude c yy-mm-dd modifier1 description of change c yy-mm-dd modifier2 description of change c c usage: call pgm-name(inarg1, inarg2, wrkarg, outarg1, ... ) c input argument list: c inarg1 - generic description, including content, units, c inarg2 - type. explain function if control variable. c c output argument list: (including work arrays) c wrkarg - generic description, etc., as above. c outarg1 - explain completely if error return c errflag - even if many lines are needed c c input files: (delete if no input files in subprogram) c ddname1 - generic name & content c c output files: (delete if no output files in subprogram) c ddname2 - generic name & content as above c ft06f001 - include if any printout c c remarks: list caveats, other helpful hints or information c c attributes: c language: indicate extensions, compiler options c machine: nas, cyber, whatever c c$$$ subroutine gauss_lat_nmc(gaul,k) c implicit real*8(a-h,o-z) dimension a(500) real*4 gaul(1) c save c esp=1.d-14 c=(1.d0-(2.d0/3.14159265358979d0)**2)*0.25d0 fk=k kk=k/2 call bsslz1(a,kk) do 30 is=1,kk xz=cos(a(is)/sqrt((fk+0.5d0)**2+c)) iter=0 10 pkm2=1.d0 pkm1=xz iter=iter+1 if(iter.gt.10) go to 70 do 20 n=2,k fn=n pk=((2.d0*fn-1.d0)*xz*pkm1-(fn-1.d0)*pkm2)/fn pkm2=pkm1 20 pkm1=pk pkm1=pkm2 pkmrk=(fk*(pkm1-xz*pk))/(1.d0-xz**2) sp=pk/pkmrk xz=xz-sp avsp=abs(sp) if(avsp.gt.esp) go to 10 a(is)=xz 30 continue if(k.eq.kk*2) go to 50 a(kk+1)=0.d0 pk=2.d0/fk**2 do 40 n=2,k,2 fn=n 40 pk=pk*fn**2/(fn-1.d0)**2 50 continue do 60 n=1,kk l=k+1-n a(l)=-a(n) 60 continue c radi=180./(4.*atan(1.)) do 211 n=1,k gaul(n)=acos(a(n))*radi-90.0 211 continue c print *,'gaussian lat (deg) for jmax=',k c print *,(gaul(n),n=1,k) c return 70 write(6,6000) 6000 format(//5x,14herror in gauaw//) stop end c c$$$ subprogram documentation block c . . . c subprogram: bsslz1 calculates bessel functions c prgmmr: s. j. lord org: w/nmc22 date: 91-06-06 c c abstract: calculates bessel functions c c program history log: c 91-06-06 s. j. lord - copied from kanamitsu library c yy-mm-dd modifier1 description of change c yy-mm-dd modifier2 description of change c c usage: call pgm-name(inarg1, inarg2, wrkarg, outarg1, ... ) c input argument list: c inarg1 - generic description, including content, units, c inarg2 - type. explain function if control variable. c c output argument list: (including work arrays) c wrkarg - generic description, etc., as above. c outarg1 - explain completely if error return c errflag - even if many lines are needed c c input files: (delete if no input files in subprogram) c ddname1 - generic name & content c c output files: (delete if no output files in subprogram) c ddname2 - generic name & content as above c ft06f001 - include if any printout c c remarks: list caveats, other helpful hints or information c c attributes: c language: indicate extensions, compiler options c machine: nas, cyber, whatever c c$$$ subroutine bsslz1(bes,n) c c implicit real*8(a-h,o-z) dimension bes(n) dimension bz(50) c data pi/3.14159265358979d0/ data bz / 2.4048255577d0, 5.5200781103d0, $ 8.6537279129d0,11.7915344391d0,14.9309177086d0,18.0710639679d0, $ 21.2116366299d0,24.3524715308d0,27.4934791320d0,30.6346064684d0, $ 33.7758202136d0,36.9170983537d0,40.0584257646d0,43.1997917132d0, $ 46.3411883717d0,49.4826098974d0,52.6240518411d0,55.7655107550d0, $ 58.9069839261d0,62.0484691902d0,65.1899648002d0,68.3314693299d0, $ 71.4729816036d0,74.6145006437d0,77.7560256304d0,80.8975558711d0, $ 84.0390907769d0,87.1806298436d0,90.3221726372d0,93.4637187819d0, $ 96.6052679510d0,99.7468198587d0,102.888374254d0,106.029930916d0, $ 109.171489649d0,112.313050280d0,115.454612653d0,118.596176630d0, $ 121.737742088d0,124.879308913d0,128.020877005d0,131.162446275d0, $ 134.304016638d0,137.445588020d0,140.587160352d0,143.728733573d0, $ 146.870307625d0,150.011882457d0,153.153458019d0,156.295034268d0/ nn=n if(n.le.50) go to 12 bes(50)=bz(50) do 5 j=51,n 5 bes(j)=bes(j-1)+pi nn=49 12 do 15 j=1,nn 15 bes(j)=bz(j) return end subroutine fix_poles(fld_out,nio,njo,undef, $ spole_point,npole_point) dimension fld_out(nio,njo) logical spole_point,npole_point rmeans=0.0 rmeann=0.0 icnts=0 icntn=0 do i=1,nio if(fld_out(i,1).ne.undef) then rmeans=rmeans+fld_out(i,1) icnts=icnts+1 endif if(fld_out(i,njo).ne.undef) then rmeann=rmeann+fld_out(i,njo) icntn=icntn+1 endif end do if(icnts.gt.0) then rmeans=rmeans/float(icnts) else rmeans=undef endif if(icntn.gt.0) then rmeann=rmeann/float(icntn) else rmeann=undef endif if(spole_point) then do i=1,nio fld_out(i,1)=rmeans end do end if if(npole_point) then do i=1,nio fld_out(i,njo)=rmeann end do end if return end