Blame | Last modification | View Log | Download | RSS feed
PROGRAM main_calc_qgpvc ********************************************************************************c * CALCULATE QUASI-GEOSTROPHIC PV ACCORDING TO ITS DEFINITION *c * Michael Sprenger / Summer, Autumn 2006 *c ********************************************************************************c --------------------------------------------------------------------------------c Declaration of variables, parameters, externals and common blocksc --------------------------------------------------------------------------------implicit nonec Input and output filecharacter*80 diagfilecharacter*80 referfilec Grid parametersinteger nx,ny,nzreal xmin,ymin,zmin,xmax,ymax,zmaxreal dx,dy,dzreal deltax,deltay,deltazreal mdvreal, allocatable,dimension (:,:) :: coriolc Reference statereal, allocatable,dimension (:) :: nsqrefreal, allocatable,dimension (:) :: thetarefreal, allocatable,dimension (:) :: rhorefreal, allocatable,dimension (:) :: pressrefreal, allocatable,dimension (:) :: zrefc 3d fields for calculation of qgPVreal,allocatable,dimension (:,:,:) :: qgpv,th,uu,vvc Auxiliary variablesinteger i,j,kinteger statcharacter*80 varnamec --------------------------------------------------------------------------------c Inputc --------------------------------------------------------------------------------print*,'********************************************************'print*,'* CALC_QGPV *'print*,'********************************************************'c Read parameter fileopen(10,file='fort.10')read(10,*) diagfileread(10,*) referfileclose(10)print*print*,trim(diagfile)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,> diagfile)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 Coriolis parametersallocate(coriol(0:nx,0:ny),STAT=stat)if (stat.ne.0) print*,'error allocating coriol'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 3d fieldsallocate(qgpv(0:nx,0:ny,0:nz),STAT=stat)if (stat.ne.0) print*,'error allocating qgpv'allocate(uu(0:nx,0:ny,0:nz),STAT=stat)if (stat.ne.0) print*,'error allocating uu'allocate(vv(0:nx,0:ny,0:nz),STAT=stat)if (stat.ne.0) print*,'error allocating vv'allocate(th(0:nx,0:ny,0:nz),STAT=stat)if (stat.ne.0) print*,'error allocating th'c --------------------------------------------------------------------------------c Calculate the qgPV from definition and put it onto filec --------------------------------------------------------------------------------c Read data from filevarname='U'call read_inp (uu,varname,diagfile,> nx,ny,nz,dx,dy,dz,xmin,ymin,zmin,mdv)varname='V'call read_inp (vv,varname,diagfile,> nx,ny,nz,dx,dy,dz,xmin,ymin,zmin,mdv)varname='TH'call read_inp (th,varname,diagfile,> nx,ny,nz,dx,dy,dz,xmin,ymin,zmin,mdv)c Read reference profile and grid 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 Calculate qgPVprint*,'C qgPV'call calc_qgpv (qgpv,uu,vv,th,> rhoref,pressref,nsqref,thetaref,coriol,> nx,ny,nz,deltax,deltay,deltaz,mdv)c Write result to netcdf filevarname='QGPV_DIA'call write_inp (qgpv,varname,diagfile,nx,ny,nz)endc ********************************************************************************c * NETCDF OUTPUT *c ********************************************************************************c --------------------------------------------------------------------------------c Write input field to netcdfc --------------------------------------------------------------------------------SUBROUTINE write_inp (field,fieldname,pvsrcfile,nx,ny,nz)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.implicit nonec Declaration of subroutine parametersinteger nx,ny,nzreal field (0:nx,0:ny,0:nz)character*80 fieldnamecharacter*80 pvsrcfilec Auxiliary variablesinteger cdfid,statinteger vardim(4)real misdatreal varmin(4),varmax(4),stag(4)integer ndimin,outid,i,j,kreal max_threal tmp(0:nx,0:ny,0:nz)integer ntimesreal time(200)integer nvarscharacter*80 vnam(100),varnameinteger isokc Get grid parameters from THETAcall cdfopn(pvsrcfile,cdfid,stat)if (stat.ne.0) goto 998call getvars(cdfid,nvars,vnam,stat)if (stat.ne.0) goto 998isok=0varname='TH'call check_varok(isok,varname,vnam,nvars)if (isok.eq.0) goto 998call 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 998call clscdf(cdfid,stat)if (stat.ne.0) goto 998c Save variables (write definition, if necessary)call cdfwopn(pvsrcfile,cdfid,stat)if (stat.ne.0) goto 998isok=0varname=fieldnamecall check_varok(isok,varname,vnam,nvars)if (isok.eq.0) thencall putdef(cdfid,varname,ndimin,misdat,vardim,> varmin,varmax,stag,stat)if (stat.ne.0) goto 998endifcall putdat(cdfid,varname,time(1),0,field,stat)print*,'W ',trim(varname),' ',trim(pvsrcfile)if (stat.ne.0) goto 998c Close input netcdf filecall clscdf(cdfid,stat)if (stat.ne.0) goto 998returnc Exception handling998 print*,'Write_Inp: Problem with input netcdf file... Stop'stopendc --------------------------------------------------------------------------------c Read input fieldsc --------------------------------------------------------------------------------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 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 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='TH'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 Calculate qgPV from wind and thetac --------------------------------------------------------------------------------subroutine calc_qgpv (qgpv,uu,vv,th,> rhoref,pressref,nsqref,thetaref,coriol,> nx,ny,nz,deltax,deltay,deltaz,mdv)c Calculate qgPV from wind and potential temperature according toc equation 2.9 p 16 Thesis Rene Fehlmann. Note a cartesian grid withc equidistant grid spacings <deltax,deltay,deltaz> is assumend. Noc 'correction' is made for spherical geoemtry.implicit nonec Declaration of subroutine parametersinteger nx,ny,nzreal qgpv(0:nx,0:ny,0:nz)real uu(0:nx,0:ny,0:nz)real vv(0:nx,0:ny,0:nz)real th(0:nx,0:ny,0:nz)real rhoref(0:2*nz)real nsqref(0:2*nz)real thetaref(0:2*nz)real pressref(0:2*nz)real deltax,deltay,deltazreal mdvreal coriol(0:nx,0:ny)c Numerical epsilon and physical constantsreal gparameter (g=9.81)real epsparameter (eps=0.01)real scaleparameter (scale=1e6)c Auxiliary variablesinteger i,j,kinteger kk,jjreal dvdx(0:nx,0:ny,0:nz)real dudy(0:nx,0:ny,0:nz)real dtdz(0:nx,0:ny,0:nz)real t1,t2c Calculate horizontal derivatives dudy and dvdx of velocitydo k=0,nzdo j=0,nydo i=0,nxc Calculate dudyif (j.eq.0) thenif ( (abs(uu(i,1,k)-mdv).gt.eps).and.> (abs(uu(i,0,k)-mdv).gt.eps)) thendudy(i,0,k)=(uu(i,1,k)-uu(i,0,k))/deltayelsedudy(i,0,k)=mdvendifelseif (j.eq.ny) thenif ( (abs(uu(i,ny, k)-mdv).gt.eps).and.> (abs(uu(i,ny-1,k)-mdv).gt.eps)) thendudy(i,ny,k)=(uu(i,ny,k)-uu(i,ny-1,k))/deltayelsedudy(i,ny,k)=mdvendifelseif ( (abs(uu(i,j+1,k)-mdv).gt.eps).and.> (abs(uu(i,j-1,k)-mdv).gt.eps)) thendudy(i,j,k)=(uu(i,j+1,k)-uu(i,j-1,k))/(2.*deltay)elsedudy(i,j,k)=mdvendifendifc Calculate dvdxif (i.eq.0) thenif ((abs(vv(1,j,k)-mdv).gt.eps).and.> (abs(vv(0,j,k)-mdv).gt.eps)) thendvdx(0,j,k)=(vv(1,j,k)-vv(0,j,k))/deltaxelsedvdx(0,j,k)=mdvendifelseif (i.eq.nx) thenif ((abs(vv(nx, j,k)-mdv).gt.eps).and.> (abs(vv(nx-1,j,k)-mdv).gt.eps)) thendvdx(nx,j,k)=(vv(nx,j,k)-vv(nx-1,j,k))/deltaxelsedvdx(nx,j,k)=mdvendifelseif ((abs(vv(i+1,j,k)-mdv).gt.eps).and.> (abs(vv(i-1,j,k)-mdv).gt.eps)) thendvdx(i,j,k)=(vv(i+1,j,k)-vv(i-1,j,k))/(2.*deltax)elsedvdx(i,j,k)=mdvendifendifenddoenddoenddoc Calculate vertical derivative of potential temperaturedo i=0,nxdo j=0,nydo k=0,nzif (k.eq.0) thenif ((abs(th(i,j,2)-mdv).gt.eps).and.> (abs(th(i,j,1)-mdv).gt.eps)) thent1=rhoref(2)*th(i,j,1)/thetaref(2)/nsqref(2)*gt2=rhoref(0)*th(i,j,0)/thetaref(0)/nsqref(0)*gdtdz(i,j,0)=(t1-t2)/deltazelsedtdz(i,j,0)=mdvendifelse if (k.eq.nz) thenif ((abs(th(i,j,nz )-mdv).gt.eps).and.> (abs(th(i,j,nz-1)-mdv).gt.eps)) thenkk=2*nzt1=rhoref(kk )*th(i,j,nz )/> thetaref(kk)/nsqref(kk)*gt2=rhoref(kk-2)*th(i,j,nz-1)/> thetaref(kk-2)/nsqref(kk-2)*9.8dtdz(i,j,nz)=(t1-t2)/deltazelsedtdz(i,j,nz)=mdvendifelseif ((abs(th(i,j,k+1)-mdv).gt.eps).and.> (abs(th(i,j,k )-mdv).gt.eps).and.> (abs(th(i,j,k-1)-mdv).gt.eps)) thenkk=2*kt1=rhoref(kk+1)*(th(i,j,k)+th(i,j,k+1))/2.> /thetaref(kk+1)/nsqref(kk+1)*gt2=rhoref(kk-1)*(th(i,j,k)+th(i,j,k-1))/2.> /thetaref(kk-1)/nsqref(kk-1)*gdtdz(i,j,k)=(t1-t2)/deltazelsedtdz(i,j,k)=mdvendifendifenddoenddoenddoc Calculate qgPVdo i=0,nxdo j=0,nydo k=0,nzkk=2*kif ((abs(dudy(i,j,k)-mdv).gt.eps).and.> (abs(dvdx(i,j,k)-mdv).gt.eps).and.> (abs(dtdz(i,j,k)-mdv).gt.eps)) thenqgpv(i,j,k)=-dudy(i,j,k)+dvdx(i,j,k)+> coriol(i,j)*dtdz(i,j,k)/rhoref(kk)elseqgpv(i,j,k)=mdvendifenddoenddoenddoend