Blame | Last modification | View Log | Download | RSS feed
PROGRAM set_boundconc ************************************************************************c * Set boundary conditions for inversion; lower and upper boundary *c * conditions for potential temperature; lateral boundary conditions *c * for zonal and meridional wind; in particular, missing data values *c * are removed. *c * *c * Michael Sprenger / Summer 2006 *c ************************************************************************c --------------------------------------------------------------------------------c Declaration of variables, parameters, externals and common blocksc --------------------------------------------------------------------------------implicit nonec Input and output filecharacter*80 anomafilecharacter*80 referfilec Grid parametersinteger nx,ny,nzreal xmin,ymin,zmin,xmax,ymax,zmaxreal dx,dy,dzreal mdvreal deltax,deltay,deltazreal, allocatable,dimension (:,:) :: coriolc Reference statereal, allocatable,dimension (:) :: nsqrefreal, allocatable,dimension (:) :: thetarefreal, allocatable,dimension (:) :: rhorefreal, allocatable,dimension (:) :: pressrefreal, allocatable,dimension (:) :: zrefC Boundary conditionsreal, allocatable,dimension (:,:) :: thetatopreal, allocatable,dimension (:,:) :: thetabotreal, allocatable,dimension (:,:) :: uareal, allocatable,dimension (:,:) :: ubreal, allocatable,dimension (:,:) :: vareal, allocatable,dimension (:,:) :: vbc 3d arraysreal,allocatable,dimension (:,:,:) :: th_anom,pv_anomreal,allocatable,dimension (:,:,:) :: uu_anom,vv_anomc Auxiliary variablesinteger i,j,k,kkinteger statcharacter*80 varnameinteger n1,n2c --------------------------------------------------------------------------------c Inputc --------------------------------------------------------------------------------print*,'********************************************************'print*,'* CHECK_BOUNDCON *'print*,'********************************************************'c Read parameter fileopen(10,file='fort.10')read(10,*) anomafileread(10,*) referfileclose(10)print*print*,trim(anomafile)print*,trim(referfile)print*c Get lat/lon gid parameters from input filecall read_dim (nx,ny,nz,dx,dy,dz,xmin,ymin,zmin,mdv,> anomafile)print*,'Read_Dim: nx,ny,nz = ',nx,ny,nzprint*,' dx,dy,dz = ',dx,dy,dzprint*,' xmin,ymin,zmin = ',xmin,ymin,zminprint*,' mdv = ',mdvprint*c Count from 0, not from 1: consistent with <inv_cart.f>.nx=nx-1ny=ny-1nz=nz-1c Allocate memory for 3d arraysallocate(pv_anom (0:nx,0:ny,0:nz),STAT=stat)if (stat.ne.0) print*,'error allocating pv_anom'allocate(th_anom (0:nx,0:ny,0:nz),STAT=stat)if (stat.ne.0) print*,'error allocating th_anom'allocate(uu_anom (0:nx,0:ny,0:nz),STAT=stat)if (stat.ne.0) print*,'error allocating uu_anom'allocate(vv_anom (0:nx,0:ny,0:nz),STAT=stat)if (stat.ne.0) print*,'error allocating vv_anom'c Allocate memory for reference profileallocate(rhoref (0:2*nz),STAT=stat)if (stat.ne.0) print*,'error allocating rhoref'allocate(pressref(0:2*nz),STAT=stat)if (stat.ne.0) print*,'error allocating pressref'allocate(thetaref(0:2*nz),STAT=stat)if (stat.ne.0) print*,'error allocating thetaref'allocate(nsqref (0:2*nz),STAT=stat)if (stat.ne.0) print*,'error allocating nsqref'allocate(zref (0:2*nz),STAT=stat)if (stat.ne.0) print*,'error allocating zref'c Allocate memory for Coriolis parameterallocate(coriol(0:nx,0:ny),STAT=stat)if (stat.ne.0) print*,'error allocating f'c Allocate memory for boundary conditionsallocate(thetatop(0:nx,0:ny),stat=stat)if (stat.ne.0) print*,'*** error allocating array thetatop ***'allocate(thetabot(0:nx,0:ny),stat=stat)if (stat.ne.0) print*,'*** error allocating array thetabot ***'allocate(ua(0:nx,0:nz),stat=stat)if (stat.ne.0) print*,'*** error allocating array ua ***'allocate(ub(0:nx,0:nz),stat=stat)if (stat.ne.0) print*,'*** error allocating array ub ***'allocate(va(0:ny,0:nz),stat=stat)if (stat.ne.0) print*,'*** error allocating array va ***'allocate(vb(0:ny,0:nz),stat=stat)if (stat.ne.0) print*,'*** error allocating array vb ***'c Read reference profile and ngrid parameterscall read_ref (nsqref,rhoref,thetaref,pressref,zref,> nx,ny,nz,deltax,deltay,deltaz,coriol,> referfile)deltax=1000.*deltaxdeltay=1000.*deltayprint*,'Deltax,deltay,deltaz =',deltax,deltay,deltazc Read data from MOD filevarname='QGPV'call read_inp (pv_anom,varname,anomafile,> nx,ny,nz,dx,dy,dz,xmin,ymin,zmin,mdv)varname='TH'call read_inp (th_anom,varname,anomafile,> nx,ny,nz,dx,dy,dz,xmin,ymin,zmin,mdv)varname='U'call read_inp (uu_anom,varname,anomafile,> nx,ny,nz,dx,dy,dz,xmin,ymin,zmin,mdv)varname='V'call read_inp (vv_anom,varname,anomafile,> nx,ny,nz,dx,dy,dz,xmin,ymin,zmin,mdv)c --------------------------------------------------------------------------------c Consistency check for boundary conditions and adaptionsc --------------------------------------------------------------------------------c Copy 3d to boundary conditionsdo i=0,nxdo j=0,nythetatop(i,j)=th_anom(i,j,nz)thetabot(i,j)=th_anom(i,j,0)enddoenddodo i=0,nxdo k=0,nzua(i,k)=uu_anom(i, 0,k)ub(i,k)=uu_anom(i,ny,k)enddoenddodo j=0,nydo k=0,nzva(j,k)=vv_anom( 0,j,k)vb(j,k)=vv_anom(nx,j,k)enddoenddoc Check the lower and upper boundary condition for consistency checkprint*call combouncon(pv_anom,nsqref,rhoref,thetatop,> thetabot,thetaref,coriol,ua,ub,va,vb,> nx,ny,nz,deltax,deltay,deltaz)print*endc ********************************************************************************c * NETCDF INPUT AND OUTPUT *c ********************************************************************************c --------------------------------------------------------------------------------c Read input fields for reference profilec --------------------------------------------------------------------------------SUBROUTINE read_inp (field,fieldname,pvsrcfile,> nx,ny,nz,dx,dy,dz,xmin,ymin,zmin,mdv)c Read <fieldname> from netcdf file <pvsrcfile> into <field>. The grid is specifiedc by <nx,ny,nz,dx,dy,dz,xmin,ymin,zmin>. A check is performed whether the inputc files are consitent with this grid. The missing data value is set to <mdv>.implicit nonec Declaration of subroutine parametersinteger nx,ny,nzreal field(0:nx,0:ny,0:nz)character*80 fieldnamecharacter*80 pvsrcfilereal dx,dy,dz,xmin,ymin,zminreal mdvc Numerical and physical parametersreal epsparameter (eps=0.01)c Auxiliary variablesinteger cdfid,stat,cdfid99integer vardim(4)real misdatreal varmin(4),varmax(4),stag(4)integer ndimin,outid,i,j,kreal max_threal tmp(nx,ny,nz)integer ntimesreal time(200)integer nvarscharacter*80 vnam(100),varnameinteger isokc Open the input netcdf filecall cdfopn(pvsrcfile,cdfid,stat)if (stat.ne.0) goto 998c Check whether needed variables are on filecall getvars(cdfid,nvars,vnam,stat)if (stat.ne.0) goto 998isok=0varname=trim(fieldname)call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) goto 998c Get the grid parameters from thetacall getdef(cdfid,varname,ndimin,misdat,vardim,> varmin,varmax,stag,stat)if (stat.ne.0) goto 998time(1)=0.call gettimes(cdfid,time,ntimes,stat)if (stat.ne.0) goto 998c Check whether grid parameters are consistentif ( (vardim(1).ne.(nx+1)).or.> (vardim(2).ne.(ny+1)).or.> (vardim(3).ne.(nz+1)).or.> (abs(varmin(1)-xmin).gt.eps).or.> (abs(varmin(2)-ymin).gt.eps).or.> (abs(varmin(3)-zmin).gt.eps).or.> (abs((varmax(1)-varmin(1))/real(vardim(1)-1)-dx).gt.eps).or.> (abs((varmax(2)-varmin(2))/real(vardim(2)-1)-dy).gt.eps).or.> (abs((varmax(3)-varmin(3))/real(vardim(3)-1)-dz).gt.eps) )>thenprint*,'Input grid inconsitency...'print*,' Nx = ',vardim(1),nx+1print*,' Ny = ',vardim(2),ny+1print*,' Nz = ',vardim(3),nz+1print*,' Varminx = ',varmin(1),xminprint*,' Varminy = ',varmin(2),yminprint*,' Varminz = ',varmin(3),zminprint*,' Dx = ',(varmax(1)-varmin(1))/real(nx-1),dxprint*,' Dy = ',(varmax(2)-varmin(2))/real(ny-1),dyprint*,' Dz = ',(varmax(3)-varmin(3))/real(nz-1),dzgoto 998endifc Load variablescall getdef(cdfid,varname,ndimin,misdat,vardim,> varmin,varmax,stag,stat)if (stat.ne.0) goto 998call getdat(cdfid,varname,time(1),0,field,stat)print*, 'R ',trim(varname),' ',trim(pvsrcfile)if (stat.ne.0) goto 998c Close input netcdf filecall clscdf(cdfid,stat)if (stat.ne.0) goto 998c Set missing data value to <mdv>do i=1,nxdo j=1,nydo k=1,nzif (abs(field(i,j,k)-misdat).lt.eps) thenfield(i,j,k)=mdvendifenddoenddoenddoreturnc Exception handling998 print*,'Read_Inp: Problem with input netcdf file... Stop'stopendc --------------------------------------------------------------------------------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)>. If this isC the case, <isok> is incremented by 1. Otherwise <isok> 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+1enddoendc --------------------------------------------------------------------------------c Get grid parametersc --------------------------------------------------------------------------------subroutine read_dim (nx,ny,nz,dx,dy,dz,xmin,ymin,zmin,mdv,> pvsrcfile)c Get the grid parameters from the variable <THETA> on the input file <pvsrcfile>.c The grid parameters arec nx,ny,nz : Number of grid points in x, y and z directionc xmin,ymin,zmin : Minimum domain coordinates in x, y and z directionc xmax,ymax,zmax : Maximal domain coordinates in x, y and z directionc dx,dy,dz : Horizontal and vertical resolutionc Additionally, it is checked whether the vertical grid is equally spaced. If ok,c the grid paramters are transformed from lon/lat to distance (in meters)implicit nonec Declaration of subroutine parameterscharacter*80 pvsrcfileinteger nx,ny,nzreal dx,dy,dzreal xmin,ymin,zmin,xmax,ymax,zmaxreal mdvc Numerical epsilon and other physical/geoemtrical parametersreal epsparameter (eps=0.01)c Auxiliary variablesinteger cdfid,cstidinteger ierrcharacter*80 vnam(100),varnameinteger nvarsinteger isokinteger vardim(4)real misdatreal varmin(4),varmax(4),stag(4)real aklev(1000),bklev(1000),aklay(1000),bklay(1000)real dhcharacter*80 csninteger ndiminteger ic Get all grid parameterscall cdfopn(pvsrcfile,cdfid,ierr)if (ierr.ne.0) goto 998call getvars(cdfid,nvars,vnam,ierr)if (ierr.ne.0) goto 998isok=0varname='QGPV'call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) goto 998call getcfn(cdfid,csn,ierr)if (ierr.ne.0) goto 998call cdfopn(csn,cstid,ierr)if (ierr.ne.0) goto 998call getdef(cdfid,varname,ndim,misdat,vardim,varmin,varmax,> stag,ierr)if (ierr.ne.0) goto 998nx=vardim(1)ny=vardim(2)nz=vardim(3)xmin=varmin(1)ymin=varmin(2)zmin=varmin(3)call getlevs(cstid,nz,aklev,bklev,aklay,bklay,ierr)if (ierr.ne.0) goto 998call getgrid(cstid,dx,dy,ierr)if (ierr.ne.0) goto 998xmax=varmax(1)ymax=varmax(2)zmax=varmax(3)dz=(zmax-zmin)/real(nz-1)call clscdf(cstid,ierr)if (ierr.ne.0) goto 998call clscdf(cdfid,ierr)if (ierr.ne.0) goto 998c Check whether the grid is equallay spaced in the verticaldo i=1,nz-1dh=aklev(i+1)-aklev(i)if (abs(dh-dz).gt.eps) thenprint*,'Aklev: Vertical grid must be equally spaced... Stop'print*,(aklev(i),i=1,nz)stopendifdh=aklay(i+1)-aklay(i)if (abs(dh-dz).gt.eps) thenprint*,'Aklay: Vertical grid must be equally spaced... Stop'print*,(aklay(i),i=1,nz)stopendifenddoc Set missing data valuemdv=misdatreturnc Exception handling998 print*,'Read_Dim: Problem with input netcdf file... Stop'stopendc --------------------------------------------------------------------------------c Read refernece profile from netcdfc --------------------------------------------------------------------------------SUBROUTINE read_ref (nsqref,rhoref,thetaref,pressref,zref,> nx,ny,nz,deltax,deltay,deltaz,coriol,> pvsrcfile)c Read the reference profile from filecc thetaref : Reference potential temperature (K)c pressref : Reference pressure (Pa)c rhoref : Reference density (kg/m^3)c nsqref : Stratification (s^-1)c zref : Reference height (m)c nx,nny,nz : Grid dimension in x,y,z directionc deltax,deltay,deltaz : Grid spacings used for calculations (m)c coriol : Coriolis parameter (s^-1)c pvsrcfile : Input fileimplicit nonec Declaration of subroutine parametersinteger nx,ny,nzreal nsqref (0:2*nz)real thetaref(0:2*nz)real rhoref (0:2*nz)real pressref(0:2*nz)real zref (0:2*nz)real deltax,deltay,deltazreal coriol (0:nx,0:ny)character*80 pvsrcfilec Numerical and physical parametersreal epsparameter (eps=0.01)c Auxiliary variablesinteger cdfid,statinteger vardim(4)real misdatinteger ndiminreal varmin(4),varmax(4),stag(4)integer i,j,k,nf1integer ntimesreal time(200)character*80 vnam(100),varnameinteger nvarsinteger isok,ierrreal x(0:nx,0:ny),y(0:nx,0:ny)real mean,countc Get grid description from topographycall cdfopn(pvsrcfile,cdfid,stat)if (stat.ne.0) goto 997call getvars(cdfid,nvars,vnam,stat)if (stat.ne.0) goto 997isok=0varname='ORO'call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) goto 997call getdef(cdfid,varname,ndimin,misdat,vardim,> varmin,varmax,stag,stat)if (stat.ne.0) goto 997time(1)=0.call gettimes(cdfid,time,ntimes,stat)if (stat.ne.0) goto 997call clscdf(cdfid,stat)if (stat.ne.0) goto 997c Open output netcdf filecall cdfopn(pvsrcfile,cdfid,stat)if (stat.ne.0) goto 997c Create the variable if necessarycall getvars(cdfid,nvars,vnam,stat)if (stat.ne.0) goto 997c Read data from netcdf fileisok=0varname='NSQREF'print*,'R ',trim(varname),' ',trim(pvsrcfile)call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) goto 997call getdat(cdfid,varname,time(1),0,nsqref,stat)if (stat.ne.0) goto 997isok=0varname='RHOREF'print*,'R ',trim(varname),' ',trim(pvsrcfile)call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) goto 997call getdat(cdfid,varname,time(1),0,rhoref,stat)if (stat.ne.0) goto 997isok=0varname='THETAREF'print*,'R ',trim(varname),' ',trim(pvsrcfile)call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) goto 997call getdat(cdfid,varname,time(1),0,thetaref,stat)if (stat.ne.0) goto 997isok=0varname='PREREF'print*,'R ',trim(varname),' ',trim(pvsrcfile)call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) goto 997call getdat(cdfid,varname,time(1),0,pressref,stat)if (stat.ne.0) goto 997isok=0varname='ZREF'print*,'R ',trim(varname),' ',trim(pvsrcfile)call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) goto 997call getdat(cdfid,varname,time(1),0,zref,stat)if (stat.ne.0) goto 997isok=0varname='CORIOL'print*,'R ',trim(varname),' ',trim(pvsrcfile)call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) goto 997call getdat(cdfid,varname,time(1),0,coriol,stat)if (stat.ne.0) goto 997isok=0varname='X'print*,'R ',trim(varname),' ',trim(pvsrcfile)call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) goto 997call getdat(cdfid,varname,time(1),0,x,stat)if (stat.ne.0) goto 997isok=0varname='Y'print*,'R ',trim(varname),' ',trim(pvsrcfile)call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) goto 997call getdat(cdfid,varname,time(1),0,y,stat)if (stat.ne.0) goto 997c Close netcdf filecall clscdf(cdfid,stat)if (stat.ne.0) goto 997c Determine the grid spacings <deltax, deltay, deltaz>mean=0.count=0.do i=1,nxdo j=0,nymean=mean+abs(x(i,j)-x(i-1,j))count=count+1.enddoenddodeltax=mean/countmean=0.count=0.do j=1,nydo i=0,nxmean=mean+abs(y(i,j)-y(i,j-1))count=count+1.enddoenddodeltay=mean/countmean=0.count=0.do k=1,nz-1mean=mean+abs(zref(k+1)-zref(k-1))count=count+1.enddodeltaz=mean/countreturnc Exception handling997 print*,'Read_Ref: Problem with input netcdf file... Stop'stopendc ********************************************************************************c * BOUNDARY CONDITIONS - CONSISTENCY CHECK AND ADAPTIONS *c ********************************************************************************c --------------------------------------------------------------------------------c Boundary conditionc --------------------------------------------------------------------------------subroutine combouncon(pv,nsq,rhoref,thetatop,> thetabot,thetaref,coriol,> ua,ub,va,vb,nx,ny,nz,dx,dy,dz)c Evaluate the consistency integrals A.7 from Rene's dissertation. This inegralc is a necessary condition that the von Neumann problem has a unique solution.c Adjust the upper and lower boundary conditions on <thetabot> and <thetatop>, soc that the consitency check is ok.implicit nonec Declaration of subroutine parametersinteger nx,ny,nzreal dx,dy,dzreal pv(0:nx,0:ny,0:nz)real nsq(0:2*nz)real rhoref(0:2*nz)real thetatop(0:nx,0:ny)real thetabot(0:nx,0:ny)real thetaref(0:2*nz)real coriol(0:nx,0:ny)real ua(0:nx,0:nz)real ub(0:nx,0:nz)real va(0:ny,0:nz)real vb(0:ny,0:nz)c Numerical and physical parametersreal gparameter (g=9.81)c Auxiliary variablesinteger i,j,kreal dxy,dxz,dyz,dxyzreal integr,denombot,denomtop,denomreal shifttop,shiftbotc Set the area and volume infinitesimals for integrationdxy =dx*dydxz =dx*dzdyz =dy*dzdxyz=dx*dy*dzc Init integration variablesintegr=0.c Innerdo k=1,nz-1do i=1,nx-1do j=1,ny-1integr=integr+dxyz*rhoref(2*k)*pv(i,j,k)enddoenddoenddoc ZY planedo k=1,nz-1do j=1,ny-1integr=integr+dyz*> rhoref(2*k)*(dx*pv(0, j,k)+va(j,k))cintegr=integr+dyz*> rhoref(2*k)*(dx*pv(nx,j,k)-vb(j,k))enddoenddoc ZX planedo k=1,nz-1do i=1,nx-1integr=integr+dxz*> rhoref(2*k)*(dy*pv(i,0,k)-ua(i,k))cintegr=integr+dxz*> rhoref(2*k)*(dy*pv(i,ny,k)+ub(i,k))enddoenddoc XY planedo i=1,nx-1do j=1,ny-1integr=integr+dxy*rhoref(0)*(> dz*pv(i,j,0)+coriol(i,j)*g*thetabot(i,j)/> (nsq(0)*thetaref(0)))cintegr=integr+dxy*rhoref(2*nz)*(> dz*pv(i,j,nz)-coriol(i,j)*g*thetatop(i,j)/> (nsq(2*nz)*thetaref(2*nz)))cenddoenddoc X edgesdo i=1,nx-1integr=integr+dx*> rhoref(0)*(dyz*pv(i,0,0)-> dz*ua(i,0)+dy*coriol(i,0)*g*thetabot(i,0)/> (nsq(0)*thetaref(0)))cintegr=integr+dx*> rhoref(0)*(dyz*pv(i,ny,0)+> dz*ub(i,0)+dy*coriol(i,ny)*g*thetabot(i,ny)/> (nsq(0)*thetaref(0)))cintegr=integr+dx*> rhoref(2*nz)*(dyz*pv(i,0,nz)-> dz*ua(i,nz)-dy*coriol(i,0)*g*thetatop(i,0)/> (nsq(2*nz)*thetaref(2*nz)))integr=integr+dx*> rhoref(2*nz)*(dyz*pv(i,ny,nz)+> dz*ub(i,nz)-dy*coriol(i,ny)*g*thetatop(i,ny)/> (nsq(2*nz)*thetaref(2*nz)))cenddoc Y edgesdo j=1,ny-1integr=integr+dy*> rhoref(0)*(dxz*pv(0,j,0)+> dz*va(j,0)+dx*coriol(0,j)*g*thetabot(0,j)/> (nsq(0)*thetaref(0)))cintegr=integr+dy*> rhoref(0)*(dxz*pv(nx,j,0)-> dz*vb(j,0)+dx*coriol(nx,j)*g*thetabot(nx,j)/> (nsq(0)*thetaref(0)))cintegr=integr+dy*> rhoref(2*nz)*(dxz*pv(0,j,nz)+> dz*va(j,nz)-dx*coriol(0,j)*g*thetatop(0,j)/> (nsq(2*nz)*thetaref(2*nz)))cintegr=integr+dy*> rhoref(2*nz)*(dxz*pv(nx,j,nz)-> dz*vb(j,nz)-dx*coriol(nx,j)*g*thetatop(nx,j)/> (nsq(2*nz)*thetaref(2*nz)))cenddoc Z edgesdo k=1,nz-1integr=integr+dz*> rhoref(2*k)*(dxy*pv(0,0,k)+> dy*va(0,k)-dx*ua(0,k))cintegr=integr+dz*> rhoref(2*k)*(dxy*pv(nx,0,k)-> dy*vb(0,k)-dx*ua(nx,k))cintegr=integr+dz*> rhoref(2*k)*(dxy*pv(0,ny,k)+> dy*va(ny,k)+dx*ub(0,k))cintegr=integr+dz*> rhoref(2*k)*(dxy*pv(nx,ny,k)-> dy*vb(ny,k)+dx*ub(nx,k))enddoc Pointsintegr=integr+rhoref(0)*(dxyz*pv(0,0,0)+> dyz*va(0,0)-dxz*ua(0,0)+> dxy*coriol(0,0)*g*thetabot(0,0)/> (nsq(0)*thetaref(0)))cintegr=integr+rhoref(0)*(dxyz*pv(nx,0,0)-> dyz*vb(0,0)-dxz*ua(nx,0)+> dxy*coriol(nx,0)*g*thetabot(nx,0)/> (nsq(0)*thetaref(0)))cintegr=integr+rhoref(0)*(dxyz*pv(0,ny,0)+> dyz*va(ny,0)+dxz*ub(0,0)+> dxy*coriol(0,ny)*g*thetabot(0,ny)/> (nsq(0)*thetaref(0)))cintegr=integr+rhoref(0)*(dxyz*pv(nx,ny,0)-> dyz*vb(ny,0)+dxz*ub(nx,0)+> dxy*coriol(nx,ny)*g*thetabot(nx,ny)/> (nsq(0)*thetaref(0)))cintegr=integr+rhoref(2*nz)*(dxyz*pv(0,0,nz)+> dyz*va(0,nz)-dxz*ua(0,nz)-> dxy*coriol(0,0)*g*thetatop(0,0)/> (nsq(2*nz)*thetaref(2*nz)))cintegr=integr+rhoref(2*nz)*(dxyz*pv(nx,0,nz)-> dyz*vb(0,nz)-dxz*ua(nx,nz)-> dxy*coriol(nx,0)*g*thetatop(nx,0)/> (nsq(2*nz)*thetaref(2*nz)))cintegr=integr+rhoref(2*nz)*(dxyz*pv(0,ny,nz)+> dyz*va(ny,nz)+dxz*ub(0,nz)-> dxy*coriol(0,ny)*g*thetatop(0,ny)/> (nsq(2*nz)*thetaref(2*nz)))cintegr=integr+rhoref(2*nz)*(dxyz*pv(nx,ny,nz)-> dyz*vb(ny,nz)+dxz*ub(nx,nz)-> dxy*coriol(nx,ny)*g*thetatop(nx,ny)/> (nsq(2*nz)*thetaref(2*nz)))cc Get the integrals from the reference state at bottom and topdenombot=0.denomtop=0.do i=0,nxdo j=0,nydenombot=denombot+dxy*> rhoref(0)*coriol(i,j)*g/> (nsq(0)*thetaref(0))cdenomtop=denomtop+dxy*> rhoref(2*nz)*coriol(i,j)*g/> (nsq(2*nz)*thetaref(2*nz))enddoenddodenom=denomtop-denombotc Determine the deviation of potential temperature from reference profileshiftbot=0.shifttop=0.do i=0,nxdo j=0,nyshifttop=shifttop+thetatop(i,j)shiftbot=shiftbot+thetabot(i,j)enddoenddoshifttop=shifttop/real((nx+1)*(ny+1))shiftbot=shiftbot/real((nx+1)*(ny+1))c Write some information about the consitency integralsprint*,'Consistency Check for boundary'print*,' integ = ', integrprint*,' denombot = ', denombotprint*,' denomtop = ', denomtopprint*,' denom = ', denomprint*,' theta adjustment = ', integr/denomprint*,' theta shift @ top = ', shifttop,> thetaref(2*nz)print*,' theta shift @ bot = ', shiftbot,> thetaref(0)end