气象学家公众号 发表于 2024-4-17 23:47:32

气象编程 | 大气视热源Q1和视水汽汇Q2程序

大气视热源Q1和视水汽汇Q2的程序
提供NCL、FORTRAN、IDL三种选择,推荐使用NCL。

Q1Q2_yanai.ncl: Using high-frequency data, calculate apparent-heat-source (Q1) and apparent-moisture-sink (Q2) quantities as described in:

This example uses daily mean data from NOAA/OAR/ESRL PSD, Boulder, Colorado, USA. Specifically, NCEP_Reanalysis 2 daily mean data spanning 3-9 April 1993.






This is a test script. It is not fully tested. The returned quantities are:
q1 =   (dT/dt) - ; K/day
         q2 = -[(dH/dt) +V.grad(H) +omega*(dH/dp)]            ; g/(kg-Pa)
    and
         Q1 = Cp*q1   ; apparent Heat Source
         Q2 = Lc*q2   ; apparent Moisture Sink   
具体NCL代码如下:
undef("Q1Q2_yanai.ncl")
function Q1Q2_yanai(time<li>:numeric,p,u,v,H,T,omega,npr:integer,opt:logical)
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
; NOT SUPPORTED:NOT FULLY TESTED : WORK in PROGRESS
;                  **CHECK UNITS**
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
; Nomenclature
; time    - "seconds since ..."
; p       - Pressure
; u,v   - zonal, meridional wind components
; H       - specific humidity
; T       - temperature or
; omega   - vertical velocity
; npr   - demension number corresponding to pressure dimension
; opt   - set to False
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;;Q1= Cp*dTdt - Cp*(omega*ss-advT)
;;Q1= Cp*[ dTdt- omega*ss-advT ]
;;q1= dTdt- omega*ss-advT   
;;Q1= Cp*[ q1 ]                  
;;
;;Q1= Total diabatic heating [including radiation, latent heating, and
;;      sfc heat flux) and sub-grid scale heat flux convergence
;;---
;;q2= -(dHdt +advH +dHdp)
;;Q2= Lc*[ q2 ]
;;
;;Q2= the latent heating due to condensation or evaporation processes
;;      and subgrid-scale moisture flux convergences,
;++++++++++++++++++++++++++++++++++++++++++++
; References:
;
; <a href="https://renqlsysu.github.io/2019/02/01/apparent_heat_source/" target="_blank">https://renqlsysu.github.io/2019/02/01/apparent_heat_source/</a>
;
; Yanai, M. (1961):
; A detailed analysis of typhoon formation.
; J. Meteor. Soc. Japan , 39 , 187–214
;
; Yanai et al (1973):
;Determination of bulk properties of tropical cloud clusters
;    from large-scale heat and moisture budgets.
;J.Atmos.Sci., 30 , 611–627,
;<a href="https://doi.org/10.1175/1520-0469" target="_blank">https://doi.org/10.1175/1520-0469</a>(1973)030<0611:DOBPOT>2.0.CO;2
;
; Yanai, M and T.Tomita (1998):
; <a href="https://pdfs.semanticscholar.org/fb57/a6a59cc4a684194b5e622ea6f875d0b4439a.pdf" target="_blank">https://pdfs.semanticscholar.org/fb57/a6a59cc4a684194b5e622ea6f875d0b4439a.pdf</a>
;********************************************
; Diabatic heating in the atmosphere is a combined consequence of
; radiative fluxes, phase changes of water substance, and turbulent
; flux of sensible heat from the earth's surface.
;
; In the tropics, it is the major driving force of the atmospheric circulation.
; It responds to the vertical gradient of diabatic heating.
;********************************************
local dimp, dimu, dimv, dimH, dimT, dimo             \
    , rankp, ranku, rankv, rankH, rankT, ranko       \
    , Cp, Lc, dTdt, ss, opt_adv, long_name, units    \
    , gridType, advT, q1, Q1, dHdt, advH, loq, q2, Q2
begin
;;             Use for error testing
;;dimp         = dimsizes(p)
;;dimu         = dimsizes(u)
;;dimv         = dimsizes(v)
;;dimH         = dimsizes(H)
;;dimT         = dimsizes(T)
;;dimo         = dimsizes(omega)

;;rankp      = dimsizes(dimp)
;;ranku      = dimsizes(dimu)
;;rankv      = dimsizes(dimv)
;;rankH      = dimsizes(dimH)
;;rankT      = dimsizes(dimT)
;;ranko      = dimsizes(dimo)

;*******************************************
;---Compute local dT/dt
;*******************************************

dTdt = center_finite_diff_n (T,time,False,0,0)   ; 'time' is 'seconds since'
copy_VarCoords(T, dTdt)
dTdt@longname = "Temperature: Local Time derivative"
dTdt@units = "K/s"
printVarSummary(dTdt)
printMinMax(dTdt,0)
print("-----")
   
;****************************************
;---Compute static stability <==>or "K-m-s2/kg"
;****************************************

ss= static_stability (p , T, 1, 0)
printVarSummary(ss)
printMinMax(ss,0)
print("-----")

;****************************************
;---Compute advection term: spherical harmonics
;---U*(dT/dx) + V*(dT/dy): ->
;****************************************

opt_adv   = 0
long_name = "temp advection"
units   = "K/s"
gridType= 1
advT      = advect_variable(u,v,T,gridType,long_name,units,opt_adv)
   
;****************************************
;---Net Heat
;****************************************

q1 = dTdt - (omega*ss-advT)      ; term_1 - term_2
q1@long_name = "q1: Net Heat Flux"
q1@units   = "K/s"
copy_VarCoords(T,q1)
printVarSummary(q1)
printMinMax(q1,0)
print("-----")

;****************************************
;---Apparent Heat Source
;****************************************

Cp         = 1004.64
Cp@long_name = "specific heat of dry air at constant pressure"
Cp@units   = "J/(K-kg)"; /(K-kg) => / => m2/

Q1= Cp*q1; -> -> [(kg-m2/s2)/(kg-s)) -> [ m2/s3 ]
               ; -> [(J/s)(1/kg)] -> W/kg   ???
Q1@long_name = "Q1: Total Diabatic Heating as the Apparent Heat Source"
Q1@units   = "m2/s3"   
copy_VarCoords(T,Q1)
printVarSummary(Q1)
printMinMax(Q1,0)
print("-----")

;*******************************************
;---Compute local dH/dt   
;*******************************************

dHdt = center_finite_diff_n (H,time,False,0,0)
copy_VarCoords(H, dHdt)
dHdt@longname = "Specific Humidity: Local Time derivative"
dHdt@units = "g/(kg-s)"    ; (g/kg)/s
printVarSummary(dHdt)
printMinMax(dHdt,0)
print("-----")

;****************************************
;---Compute advection term: global fixed grid: spherical harmonics
;---U*(dH/dlon) + V*(dH/dlat)
;****************************************

long_name = "moisture advection"
units   = "g/(kg-s)"   ; (m/s)*(g/kg)*(1/m)
advH      = advect_variable(u,v,H,gridType,long_name,units,opt_adv)

;****************************************
;---Compute vertical movement of H
;****************************************

dHdp = center_finite_diff_n (H,p,False,1,npr)
copy_VarCoords(H, dHdp)
dHdp@longname = "Specific Humidity: Local Vertical Derivative"
dHdp@units = "g/(kg-Pa)"   ; (g/kg)/Pa
printVarSummary(dHdp)
printMinMax(dHdp,0)
print("-----")

dHdp= omega*dHdp               ; overwrite ... convenience
dHdp@longname = "Specific Humidity: Vertical Moisture Transport"
dHdp@units    = "g/(kg-s)"       ; [(Pa/s)(g/kg)/Pa)]
printVarSummary(dHdp)
printMinMax(dHdp,0)
print("-----")
   
;****************************************
;---Apparent Moisture Sink
;****************************************

q2    = -(dHdt +advH +dHdp)
q2@long_name = "q2: moisture sink"      ; "?apparent? drying rate"
q2@units   = "g/(kg-s)"
copy_VarCoords(T,q2)
printVarSummary(q2)

Lc         = 2.26e6    ; =Latent Heat of Condensation/Vaporization
Lc@long_name = "Latent Heat of Condensation/Vaporization"
Lc@units   = "J/kg"; ==> "m2/s2"

Q2    = Lc*q2          ; (J/kg)(g/(kg-s))->(m2/s2)(g/(kg-s)) ->[(g/kg)]
                         ; J->kg-m2/s2 = N-m = Pa/m3 = W-s       ; energy         
Q2@long_name = "Q2: Apparent Moisture Sink"
Q2@units   = "(g/kg)"   
copy_VarCoords(T,Q2)
printVarSummary(Q2)
printMinMax(Q2,0)
print("-----")
   
;****************************************
;---Make q1, q2 to per day
;****************************************

q1 = q1*86400
q2 = q2*86400
q1@units   = "K/day"
q2@units   = "g/(kg-day)"
   
;****************************************
;---Make Q1, Q2 to per W/m2
;****************************************

;;Q1 = Q1*?????
;;Q2 = Q2*?????
;;Q1@units = "W/m2"
;;Q2@units = "W/m2"

return( )
end
;==============================================================================
;                           MAIN
;==============================================================================
netCDF= True                                       ; Write netCDF

;---Variable and file handling

diri    = "/Users/shea/Data/netCDF/"
f1      = addfile(diri+"temp_lag4tolead2.nc","r")    ; daily mean data
f2      = addfile(diri+"omega_lag4tolead2.nc","r")   
f3      = addfile(diri+"uwnd_lag4tolead2.nc","r")
f4      = addfile(diri+"vwnd_lag4tolead2.nc","r")
f5      = addfile(diri+"rhum_lag4tolead2.nc","r")
                                                       ; convenience: make all:S->N
temp    = f1->air(:,:,::-1,:)                        ; degK
omega   = f2->omega(:,:,::-1,:)                      ; Pascal/s
uwnd    = f3->uwnd(:,:,::-1,:)                     ; m/s
vwnd    = f4->vwnd(:,:,::-1,:)                     ; m/s
rhum    = short2flt(f5->rhum(:,:,::-1,:))            ; %   

;---Need specific humidity

p       = f1->level                                  ; hPa</li><li>
p4d   = conform(temp, p, 1)
q       = mixhum_ptrh (p4d, temp, rhum,-2)         ; g/kg
delete( )
q@long_name = "specific humidity"
q@units = "g/kg"
copy_VarCoords(temp, q)
printVarSummary(q)
printMinMax(q, 0)

;---Convert "hours since ..." to "seconds since ..."

time    = f5->time                                 ; "hours since 1800-1-1"
time    = time*3600                                          
time@units= "seconds since 1800-1-1 00:00:0.0"
printVarSummary(time)
print("---")
t       = time               ; Lyndz' name

ymdh = cd_calendar(time,-3)
print(ymdh)

;---Convert hPa -> Pa for function

p       = p*100                                    ; Pa
p@units = "Pa"
p!0   = "p"
p&p   =p                   ; not necessary
printVarSummary(p)
print("---")

;++++++++++++++++++++++++++++++++++++++++++++++++++++++
Cp       = 1004.64      ; specific heat of dry air at constant pressure
Cp@units = "J/(K*kg)"

npr= 1
opt= True
q1q2 = Q1Q2_yanai(time,p,uwnd,vwnd,q,temp,omega,npr,opt)
print(q1q2)

q1   = q1q2
q2   = q1q2
printVarSummary(q1)
printMinMax(q1,0)
print("================")
printVarSummary(q2)
printMinMax(q2,0)
print("================")

;Q1   = q1q2
;Q2   = q1q2

;********************************************
;---Vertical integration
; J      kg-m2/s2 = N-m = Pa/m3 = W-s       ; energy         
;********************************************

ptop= 30000.0                     ; Pa
pbot= 100000.0
vopt= 1

g   = 9.80665                     ; gravity at 45 deg lat used by the WMO
dp    = dpres_plevel_Wrap(p,pbot,ptop,0)
dpg   = dp/g                        ; Pa/(m/s2)=> (Pa-s2)/m   
dpg@long_name = "Layer Mass Weighting"
dpg@units   = "kg/m2"               ; dp/g   => Pa/(m/s2) => reduce to (kg/m2)
                                        ;             Pa (s2/m) => =>
dpg:= conform(q1,dpg,1)             ; reassign

q1int = wgt_vertical_n(q1,dpg,vopt,1) ; SUM=> (K/s)(kg/m2)
q1int@long_name = "Heat Source: vertically integrated"
q1int@units   = "(K/day)(kg/m2)"      ; (K/s)(kg/m2) => (kg-K)/(m2-s)
printVarSummary(q1int)
copy_VarCoords(temp(:,0,:,:),q1int)
printMinMax(q1int,0)
print("-----")

q2int = wgt_vertical_n(q2,dpg,vopt,1)
q2int@long_name = "Moisture Sink: vertically integrated"
q2int@units   = "g/(day-m2)"
copy_VarCoords(temp(:,0,:,:),q2int)
printMinMax(q2int,0)
print("-----")

;***********************************************
;---Save to a netcdf file
;***********************************************

if (netCDF)
      diro = "./"
      filo = "YANAI.apparent_heat.nc"
      ptho = diro+filo
      system("/bin/rm -f "+ptho)
      ncdf = addfile(ptho,"c")
   
      fAtt = True
      fAtt@title         = "Apparent Heat Source based on Yanai et al. 1973"
      fAtt@source_name   = "NCEP-NCAR Reanalysis 2"
      fAtt@source_URL    = "https://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis2.html"
      fAtt@source      = "NOAA/OAR/ESRL PSD, Boulder, Colorado, USA"
      fAtt@Conventions   = "None"
      fAtt@creation_date = systemfunc("date")
      fileattdef(ncdf,fAtt)            ; copy file attributes
   
      filedimdef(ncdf,"time",-1,True) ; make time an UNLIMITED dimension
      ncdf->q1 = q1
      ncdf->q2 = q2
end if

;***********************************************
;---Plot
;***********************************************

nt    = 4
YMDH= ymdh(nt)
LEVP= 600

opt = True
opt@PrintStat = True
stat_q1 = stat_dispersion(q1(nt,{LEVP},:,:), opt )
stat_q2 = stat_dispersion(q2(nt,{LEVP},:,:), opt )
stat_q1i= stat_dispersion(q1int(nt,:,:), opt )
stat_q2i= stat_dispersion(q2int(nt,:,:), opt )

plot= new(2,graphic)

wks   = gsn_open_wks("png","q2q1_yanai")      ; send graphics to PNG file
      
;--- mfc_adv and mfc_con at a specified pressure level

res                   = True             ; plot mods desired
res@gsnDraw         = False            ; don't draw yet
res@gsnFrame          = False            ; don't advance frame yet

res@cnFillOn          = True             ; turn on color
res@cnLinesOn         = False            ; turn off contour lines
res@cnLineLabelsOn    = False            ; turn off contour lines
;res@cnFillPalette   = "ViBlGrWhYeOrRe" ; set White-in-Middle color map
res@cnFillPalette   = "amwg256"      ; set White-in-Middle color map
;res@cnFillMode      = "RasterFill"
res@mpFillOn          = False            ; turn off map fill
;;res@lbLabelBarOn      = False            ; turn off individual cb's
res@lbOrientation   = "Vertical"
                                           ; Use a common scale
res@cnLevelSelectionMode = "ManualLevels"; manual set levels so lb consistent
res@cnMaxLevelValF       =    5.0      ; max level
res@cnMinLevelValF       = -res@cnMaxLevelValF   ; min level
res@cnLevelSpacingF      =    0.20       ; contour interval

res@gsnCenterString      = LEVP+"hPa"
plot(0) = gsn_csm_contour_map(wks,q1(nt,{LEVP},:,:),res)

res@cnMaxLevelValF       =    5.0      ; max level
res@cnMinLevelValF       = -res@cnMaxLevelValF   ; min level
res@cnLevelSpacingF      =    0.20       ; contour interval
plot(1) = gsn_csm_contour_map(wks,q2(nt,{LEVP},:,:),res)

resP                     = True          ; modify the panel plot
resP@gsnMaximize         = True
resP@gsnPanelMainString := YMDH
;;resP@gsnPanelLabelBar    = True          ; add common colorbar
gsn_panel(wks,plot,(/2,1/),resP)         ; now draw as one plot

delete(res@gsnCenterString) ; not used for this plot

res@cnMaxLevelValF       =   14000.0   ; max level
res@cnMinLevelValF       = -res@cnMaxLevelValF   ; min level
res@cnLevelSpacingF      =    500.0      ; contour interval
plot(0) = gsn_csm_contour_map(wks,q1int(nt,:,:),res)

res@cnMaxLevelValF       =    7000.0   ; max level
res@cnMinLevelValF       = -res@cnMaxLevelValF   ; min level
res@cnLevelSpacingF      =    500.0      ; contour interval
plot(1) = gsn_csm_contour_map(wks,q2int(nt,:,:),res)

gsn_panel(wks,plot,(/2,1/),resP)         ; now draw as one plot


;---Cross section

rescx                      = True                  ; plot mods desired
rescx@gsnMaximize          = True

LAT = 10
if (LAT.ge.0) then
      rescx@tiMainString   = YMDH+": "+LAT+"N"
else
      rescx@tiMainString   = YMDH+": "+ABS(LAT)+"S"
end if

rescx@cnLevelSelectionMode = "ManualLevels"      ; manual contour levels
rescx@cnLinesOn            = False            ; turn off contour lines
rescx@cnLineLabelsOn       = False
rescx@cnFillOn             = True                  ; turn on color fill
rescx@cnFillPalette      = "ViBlGrWhYeOrRe" ; set White-in-Middle color map
rescx@cnFillPalette      = "amwg256"      ; set White-in-Middle color map

rescx@cnMaxLevelValF       =5.0                  ; max level
rescx@cnMinLevelValF       = -rescx@cnMaxLevelValF ; min level
rescx@cnLevelSpacingF      =0.25               ; contour interval
plt_q1 = gsn_csm_pres_hgt(wks,q1(nt,{1000:200},{LAT},:),rescx)
rescx@cnMaxLevelValF       =5.0                  ; max level
rescx@cnMinLevelValF       = -rescx@cnMaxLevelValF ; min level
rescx@cnLevelSpacingF      =0.25               ; contour interval
plt_q2 = gsn_csm_pres_hgt(wks,q2(nt,{1000:200},{LAT},:),rescx)</li>
具体Fortran代码
C***************************************************************
C   Compute voticity divegence             YANG 1992.10.25   
C   input UUVVOUTPUT VORT DIV (APPP)            *
C***************************************************************
program calsiq
parameter(I0=71,J0=71,K0=21,kk=19,k4=12,df1=1.,df2=1.,f0=-10.)
      DIMENSION ww(i0,j0,kk,k4),w(i0,j0,kk),u(i0,j0,kk),v(i0,j0,kk)
      DIMENSION uu(i0,j0,kk,k4),TT(i0,j0,kk,k4),HH(i0,j0,kk,k4),P(K0)
   & ,t(i0,j0,kk),q(i0,j0,kk),QQ(i0,j0,kk,k4),vv(i0,j0,kk,k4)   
      DIMENSION PP(KK),siq1(i0,j0,kk,k4),siq2(i0,j0,kk,k4),h(i0,j0,kk)
      DIMENSION K88(kk),work(i0,j0,k0,k4),OROG(i0,j0),hs(i0,j0,k4)
      DIMENSION rq(i0,j0),tg(i0,j0,kk),th(i0,j0,kk),ft1(i0,j0,kk)
      DIMENSION ft(i0,j0,kk),Q1(i0,j0),Q2(i0,j0),ft3(i0,j0,kk)
c COMMON /CONTAA/RG,RD,CP,G,OMG,DLON,DLAT,FO,DF
c   & ,DLATD,DLOND,CONV,COV,DPS12
      CHARACTER*40,FILEN,FILEN1
DATA P/1000.,975.,950.,925.,900.,850.,800.,750.,700.,650.,600.,
   &550.,500.,450.,400.,350.,300.,250.,200.,150.,100/
DATA PP/1000.,950.,900.,850.,800.,750.,700.,650.,600.,
   &550.,500.,450.,400.,350.,300.,250.,200.,150.,100/
c      DATA K66/1,2,3,4,5,9/
      DATA K88/1,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21/
C******************************************************************
C   Compute VORV DIAV    liuhz 1998.10.25         *
C******************************************************************
open(11,file='e:\data\ncep0629\data\orog1.grb'
   & ,form='unformatted',access='direct',recl=i0*j0)
read(11,rec=1)
   &((orog(I,J),I=1,i0),J=1,j0)
close(11)
open(11,file='e:\data\ncep0629\data\uu0629.grb'
   & ,form='unformatted',access='direct',recl=i0*j0*k0*k4)
read(11,rec=1)
   &((((work(I,J,k,K2),I=1,i0),J=1,j0),k=1,k0),k2=1,k4)
close(11)
do kt=1,k4
do k=1,kk
k2=k88(k)
do j=1,j0
do i=1,i0
uu(i,j,k,kt)=work(i,j,k2,kt)
enddo
enddo
enddo
enddo
open(11,file='e:\data\ncep0629\data\vv0629.grb'
   & ,form='unformatted',access='direct',recl=i0*j0*k0*k4)
read(11,rec=1)
   &((((work(I,J,k,K2),I=1,i0),J=1,j0),k=1,k0),k2=1,k4)
close(11)
do kt=1,k4
do k=1,kk
k2=k88(k)
do j=1,j0
do i=1,i0
vv(i,j,k,kt)=work(i,j,k2,kt)
enddo
enddo
enddo
enddo
open(11,file='e:\data\ncep0629\data\tt0629.grb'
   & ,form='unformatted',access='direct',recl=i0*j0*k0*k4)
read(11,rec=1)
   &((((work(I,J,k,K2),I=1,i0),J=1,j0),k=1,k0),k2=1,k4)
close(11)
do kt=1,k4
do k=1,kk
k2=k88(k)
do j=1,j0
do i=1,i0
tt(i,j,k,kt)=work(i,j,k2,kt)
enddo
enddo
enddo
enddo
open(11,file='e:\data\ncep0629\data\hh0629.grb'
   & ,form='unformatted',access='direct',recl=i0*j0*k0*k4)
read(11,rec=1)
   &((((work(I,J,k,K2),I=1,i0),J=1,j0),k=1,k0),k2=1,k4)
close(11)
do kt=1,k4
do k=1,kk
k2=k88(k)
do j=1,j0
do i=1,i0
hh(i,j,k,kt)=work(i,j,k2,kt)
enddo
enddo
enddo
enddo
open(11,file='e:\data\ncep0629\data\qq0629.grb'
   & ,form='unformatted',access='direct',recl=i0*j0*k0*k4)
read(11,rec=1)
   &((((work(I,J,k,K2),I=1,i0),J=1,j0),k=1,k0),k2=1,k4)
close(11)
do kt=1,k4
do k=1,kk
k2=k88(k)
do j=1,j0
do i=1,i0
qq(i,j,k,kt)=work(i,j,k2,kt)
enddo
enddo
enddo
enddo
irec=0
jrec=0

do 100 k=1,k4
do j=1,j0
do i=1,i0
do l=1,kk
h(i,j,l)=hh(i,j,l,k)
u(i,j,l)=uu(i,j,l,k)
v(i,j,l)=vv(i,j,l,k)
t(i,j,l)=tt(i,j,l,k)
q(i,j,l)=qq(i,j,l,k)
enddo
enddo
enddo
OPEN(20,FILE='e:\data\ncep0629\data\q1t.GRB',FORM='UNFORMATTED',
   &ACCESS='DIRECT',RECL=i0*j0*(k0-1))
OPEN(21,FILE='e:\data\ncep0629\data\q1v.GRB',FORM='UNFORMATTED',
   &ACCESS='DIRECT',RECL=i0*j0*(k0-1))
OPEN(22,FILE='e:\data\ncep0629\data\q1w.GRB',FORM='UNFORMATTED',
   &ACCESS='DIRECT',RECL=i0*j0*(k0-1))
OPEN(23,FILE='e:\data\ncep0629\data\w20.GRB',FORM='UNFORMATTED',
   &ACCESS='DIRECT',RECL=i0*j0*(k0-1))
OPEN(24,FILE='e:\data\ncep0629\data\q2t.GRB',FORM='UNFORMATTED',
   &ACCESS='DIRECT',RECL=i0*j0*(k0-1))
OPEN(25,FILE='e:\data\ncep0629\data\q2v.GRB',FORM='UNFORMATTED',
   &ACCESS='DIRECT',RECL=i0*j0*(k0-1))
OPEN(26,FILE='e:\data\ncep0629\data\q2w.GRB',FORM='UNFORMATTED',
   &ACCESS='DIRECT',RECL=i0*j0*(k0-1))
OPEN(27,FILE='e:\data\ncep0629\data\q12.GRB',FORM='UNFORMATTED',
   &ACCESS='DIRECT',RECL=i0*j0)

DO L=1,kk
do i=1,i0
do j=1,j0
rq(i,j)=u(i,j,l)
enddo
enddo
call smth9(i0,j0,rq,rq)
do i=1,i0
do j=1,j0
u(i,j,l)=rq(i,j)
enddo
enddo

do i=1,i0
do j=1,j0
rq(i,j)=v(i,j,l)
enddo
enddo
call smth9(i0,j0,rq,rq)
do i=1,i0
do j=1,j0
v(i,j,l)=rq(i,j)
enddo
enddo

do i=1,i0
do j=1,j0
rq(i,j)=t(i,j,l)
enddo
enddo
call smth9(i0,j0,rq,rq)
do i=1,i0
do j=1,j0
t(i,j,l)=rq(i,j)
enddo
enddo

do i=1,i0
do j=1,j0
rq(i,j)=q(i,j,l)
enddo
enddo
call smth9(i0,j0,rq,rq)
do i=1,i0
do j=1,j0
q(i,j,l)=rq(i,j)
enddo
enddo

ENDDO

IF(K.GT.1)THEN
DO L=1,kk
do i=1,i0
do j=1,j0
rq(i,j)=tt(i,j,l,k-1)
enddo
enddo
call smth9(i0,j0,rq,rq)
do i=1,i0
do j=1,j0
tg(i,j,l)=rq(i,j)
enddo
enddo
do i=1,i0
do j=1,j0
rq(i,j)=qq(i,j,l,k-1)
enddo
enddo
call smth9(i0,j0,rq,rq)
do i=1,i0
do j=1,j0
ft1(i,j,l)=rq(i,j)
enddo
enddo

      ENDDO
ENDIF
IF(K.LT.K4)THEN
DO L=1,kk
do i=1,i0
do j=1,j0
rq(i,j)=tt(i,j,l,K+1)
enddo
enddo
call smth9(i0,j0,rq,rq)
do i=1,i0
do j=1,j0
th(i,j,l)=rq(i,j)
enddo
enddo

      do i=1,i0
do j=1,j0
rq(i,j)=qq(i,j,l,K+1)
enddo
enddo
call smth9(i0,j0,rq,rq)
do i=1,i0
do j=1,j0
ft3(i,j,l)=rq(i,j)
enddo
enddo

ENDDO
ENDIF
DT=24*3600.0            

C �����¶ȵľֵر仯
IF(K.EQ.1)THEN
DO I=1,i0
DO J=1,j0
DO L=1,kk
TG(I,J,L)=(TH(I,J,L)-T(I,J,L))/DT
fT(I,J,L)=(ft3(I,J,L)-q(I,J,L))/DT
ENDDO
ENDDO
ENDDO
ELSE IF(K.EQ.K4)THEN
DO I=1,i0
DO J=1,j0
DO L=1,kk
TG(I,J,L)=(T(I,J,L)-TG(I,J,L))/DT
fT(I,J,L)=(q(I,J,L)-fT1(I,J,L))/DT
ENDDO
ENDDO
ENDDO
ELSE
DO I=1,i0
DO J=1,j0
DO L=1,kk
TG(I,J,L)=(TH(I,J,L)-TG(I,J,L))/2.0/DT
fT(I,J,L)=(fT3(I,J,L)-fT1(I,J,L))/2.0/DT
ENDDO
ENDDO
ENDDO
ENDIF
      call CALsiq12(U,V,t,q,h,tg,ft,OROG,irec,jrec
   &          ,I0,j0,kk,df1,df2,f0,pp)

do l=1,kk
do j=1,j0
do i=1,i0
c ampv(i,j,l,k)=ampv1(i,j,l,k)+ampv2(i,j,l,k)
enddo
enddo
enddo
c      print*,ampv(12,18,11,kt)
WRITE(6,*)'TIME=',K

c pause 1111
100 continue
CLOSE(20);CLOSE(21);CLOSE(22);CLOSE(23);close(24);close(25)
close(26);close(27)

cc      write(filen1,'(a)') 'e:\data\ncep0629\data\siq1.grb'
ccc open(17,file=filen1,
cc   &      form='unformatted',access='direct',recl=i0*j0*kk*k4)
cc          write(17,rec=1) ((((siq1(I,J,K,kt),I=1,i0),J=1,j0)
cc   &      ,K=1,kk),kt=1,k4)
cc      CLOSE(17)
cc      write(filen1,'(a)') 'e:\data\ncep0629\data\siq2.grb'
cc open(17,file=filen1,
cc   &      form='unformatted',access='direct',recl=i0*j0*kk*k4)
cc          write(17,rec=1) ((((siq2(I,J,K,kt),I=1,i0),J=1,j0)
cc   &      ,K=1,kk),kt=1,k4)
cc      CLOSE(17)

      STOP
END
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
      SUBROUTINE CALsiq12(U,V,T,Q,h,tg,ft,OROG,irec,jrec
   &                           ,I0,j0,k0,df1,df2,f0,pp)               
C**************************************************************************      
C    Compute HEATIGH RATE (SOURCE/SINK) & WATER SOURCE/SINK    by liuhz 2009.3    *   
C    inputU=====> U WIND (m/s)                                                *      
C         V=====> V WIND (m/s)                                                *
C         H ======> GEOPOTENTIAL HEIHGT (GEOPOTENTIAL METER)
C         Q ====> SPECIFIC HUMIDITY (G/G)                                       *
C         T =====> TEMPERATURE (K)                                              *      
C         tg =====> local variation of TEMPERATURE                              *      
C         ft =====> local variation of SPECIFIC HUMIDITY
C         OROG======> OROGRAPHIC HEIHGT(GEOPOTENTIAL METER)                     *      
C    output UG(Q1V)=====> ADVECTIVE TRANSFER of HEAT (K/S)
C         WG(Q1W)=====> VERTICAL TRANSFEROF HEAT (K/S)      
C         W(W20)   =====> W VELOCITY (HPA/S) ;                                  *      
C         FV(Q2V)=====> ADVECTIVE TRANSFER of water (G/G/S)
C         FW(Q2W)=====> VERTICAL TRANSFEROF water (G/G/S)      
C         Q1(Q12)=====> HEAT SOURCE/SINK (K/S) ;      
C         Q2       =====> WATER SOURCE/SINK (G/G/S) ;   
C         tg (Q1T) =====> local variation of TEMPERATURE (K/S)                  *      
C         ft (Q2T) =====> local variation of SPECIFIC HUMIDITY (G/G/S)
C**************************************************************************      
C      INCLUDE 'PARAMET213'
C      PARAMETER (I0=161,J0=113,K0=13,DF1=1.0,DF2=1.0,F0=-10.)         
C       I0,J0,K0---GRID NUMBER IN X Y Z; DF1-DF2- FIELD RESOLUTION IN X Y;      
C       F0--FIRST LATITUDE FROM SOUTH TO NORTH                                 
C       P(1) --P(K0) EACH LAYEL PRESSURE FROM LOW TO HIHG                        
C      DATA PL/1000.0,925.0,850.0,700.0,600.,500.0,400.0,300.0,250.0,200.      
C   &   ,150.,100.,50./                                                      
C ���ò�ֵ��NCEP/NCAR 20��U��V��T��H���ϼ���Q1 & Q2
C ����X��Y��P��T��������
dimension OROG(i0,j0),H(i0,j0,k0),PP(k0),a(i0,j0,k0)
   &          ,siq1(I0,J0,K0),siq2(I0,J0,K0),AR(I0,J0,K0),P(k0)                        
      DIMENSION U(I0,J0,K0),V(I0,J0,K0),PL(K0),T(I0,J0,K0)               
DIMENSION PS(i0,j0),US(i0,j0),VS(i0,j0),WS(i0,j0),ts(i0,j0)
DIMENSION ILAY(i0,j0),q(i0,j0,k0),gtmp(i0,j0,k0)
DIMENSION DIVG(i0,j0,k0),DIVS(i0,j0),W(i0,j0,k0)
dimension wg(i0,j0,k0),ug(i0,j0,k0),tg(i0,j0,k0),TH(i0,j0,k0)
DIMENSION rQ(i0,j0),HT(i0,j0,k0),wt(i0,j0),Q1(i0,j0),Q2(i0,j0)
dimension ft(i0,j0,k0),fv(i0,j0,k0),fw(i0,j0,k0)
dimension ft1(i0,j0,k0),ft3(i0,j0,k0),ff(i0,j0,k0)

      COV=3.1415926/180.                                                         
c      DF=DF2                                                                  
      DLON=DF1*COV                                                               
      DLAT=DF2*COV                                                               
      DLOND=DF1                                                                  
      DLATD=DF2                                                                  
      RG=6371229.0                                                               
      DY=2.0*RG*DLAT   
ck=0.286
gama=0.0065
rd=287.04
g=9.80616
dk=g/(rd*gama)
DP=-50.0
WTt=0.0
c DT=6*3600.0            
DT=24*3600.0            
CP=1005.0
LH=2501000.0

C �����¶�ƽ��---������
do i=2,i0-1
do j=2,j0-1
      F1=(F0+FLOAT(J-1)*DLATD)*COV                                             
      DX=2.0*RG*COS(F1)*DLON                                                   
DO L=1,k0
UG(I,J,L)=U(I,J,L)*(T(I+1,J,L)-T(I-1,J,L))/DX
c   &       COS((-87.0+1.0*(j-1))*RAD)+
   &   +V(I,J,L)*(T(I,J+1,L)-T(I,J-1,L))/DY
fv(I,J,L)=U(I,J,L)*(q(I+1,J,L)-q(I-1,J,L))/DX
c   &       COS((-87.0+1.0*(j-1))*RAD)+
   &   +V(I,J,L)*(q(I,J+1,L)-q(I,J-1,L))/DY
ENDDO
ENDDO
ENDDO

do j=2,j0-1
      F1=(F0+FLOAT(J-1)*DLATD)*COV                                             
      DX=2.0*RG*COS(F1)*DLON                                                   
DO L=1,k0
UG(1,J,L)=U(1,J,L)*(T(2,J,L)-T(i0-1,J,L))/DX
c   &       COS((-87.0+1.0*(j-1))*RAD)+
   &   +V(1,J,L)*(T(1,J+1,L)-T(1,J-1,L))/DY
fv(1,J,L)=U(1,J,L)*(q(2,J,L)-q(i0-1,J,L))/DX
c   &       COS((-87.0+1.0*(j-1))*RAD)+
   &   +V(1,J,L)*(q(1,J+1,L)-q(1,J-1,L))/DY
ENDDO
DO L=1,k0
UG(i0,J,L)=U(i0,J,L)*(T(1,J,l)-T(i0-1,J,L))/DX
c   &       COS((-87.0+1.0*(j-1))*RAD)+
   &   +V(i0,J,L)*(T(i0,J+1,L)-T(i0,J-1,L))/DY
fv(i0,J,L)=U(i0,J,L)*(q(1,J,l)-q(i0-1,J,L))/DX
c   &       COS((-87.0+1.0*(j-1))*RAD)+
   &   +V(i0,J,L)*(q(i0,J+1,L)-q(i0,J-1,L))/DY
enddo
ENDDO
do l=1,k0
CALL BOU1(UG(1,1,L),I0,J0)
CALL BOU1(FV(1,1,L),I0,J0)
enddo
c      pause 888

DO I=1,i0
DO J=1,j0
C �����
DO L=1,k0
gtmp(i,j,l)=t(i,j,l)*(1000.0/pp(l))**ck
ENDDO
c ���㶥�㴹ֱ�ٶ�
WT(I,J)=-(TG(I,J,k0)+UG(I,J,k0))/
   &((GTMP(I,J,k0)-GTMP(I,J,k0-1))/DP*(PP(k0)/1000.0)**CK)

C ������ڵ��ε���Ͳ�
corog(i,j)=orog(i,j)*g
if(h(i,j,1).gt.orog(i,j))then
ip=1
else
DO L=1,k0-1
IF((H(I,J,L).LE.OROG(I,J)).AND.
   & (H(I,J,L+1).GT.OROG(I,J)))THEN
   IP=L+1
ELSE
ENDIF
ENDDO
endif
   ILAY(I,J)=IP
      
C ������¡�������ѹ---��Ԫ�������
ts(i,j)=t(i,j,ip)-gama*(orog(i,j)-h(i,j,ip))
C �ڲ������ѹ�������
if(ip.gt.1)then
CC=(H(I,J,IP)-OROG(I,J))/(H(I,J,IP)-H(I,J,IP-1))
CD=(PP(IP-1)/PP(IP))**CC
PS(I,J)=CD*PP(IP)
US(I,J)=U(I,J,IP)+CC*(U(I,J,IP)-U(I,J,IP+1))
VS(I,J)=V(I,J,IP)+CC*(V(I,J,IP)-V(I,J,IP+1))
else
ps(i,j)=pp(ip)*(1-gama*(orog(i,j)-h(i,j,ip))/t(i,j,ip))**dk
us(i,j)=u(i,j,ip)+(U(I,J,IP)-U(I,J,IP+1))*
   &(OROG(I,J)-H(I,J,IP))/(H(I,J,IP)-H(I,J,IP+1))
US(I,J)=0.6*US(I,J)
Vs(i,j)=V(i,j,ip)+(V(I,J,IP)-V(I,J,IP+1))*
   &(OROG(I,J)-H(I,J,IP))/(H(I,J,IP)-H(I,J,IP+1))
VS(I,J)=0.6*VS(I,J)
endif
enddo
enddo
C ������洹ֱ�ٶ�
do i=2,i0-1
do j=2,j0-1
      F1=(F0+FLOAT(J-1)*DLATD)*COV                                             
      DX=2.0*RG*COS(F1)*DLON                                                   

WS(I,J)=(-1.0)*PS(I,J)*g/Rd/Ts(I,J)*
   &   (US(I,J)*(OROG(I+1,J)-OROG(I-1,J))/DX
c   &       COS((-87.0+1.0*(j-1))*RAD)+
   &   +VS(I,J)*(OROG(I,J+1)-OROG(I,J-1))/DY)
ENDDO
ENDDO
CALL BOU1(WS,I0,J0)

c do j=2,j0-1
cWS(1,J)=(-1.0)*PS(1,J)*g/Rd/Ts(1,J)*
c   &   US(1,J)*(OROG(2,J)-OROG(i0-1,J))/DX
ccc   &       COS((-87.0+1.0*(j-1))*RAD)+
c   &   +VS(I,J)*(OROG(I,J+1)-OROG(I,J-1))/DY
cWS(i0,J)=(-1.0)*PS(i0,J)*g/Rd/Ts(i0,J)*
c   &   (US(i0,J)*(OROG(1,J)-OROG(i0-1,J))/DX
c   &       COS((-87.0+1.0*(j-1))*RAD)+
c   &   +VS(I,J)*(OROG(I,J+1)-OROG(I,J-1))/DY)
c enddo
C �������ɢ��
DO I=2,i0-1
DO J=2,j0-1
      F1=(F0+FLOAT(J-1)*DLATD)*COV                                             
      DX=2.0*RG*COS(F1)*DLON                                                   
      TGA=TAN(F1)/RG

DO L=1,k0
DIVG(I,J,L)=(U(I+1,J,L)-U(I-1,J,L))/DX
c   &       /COS((-87.0+1.0*(j-1))*RAD)/(2*DD)+
   &    +(V(I,J+1,L)-V(I,J-1,L))/DY-V(I,J,L)*TGA
ENDDO
ENDDO
ENDDO
iI=1
DO J=2,j0-1
      F1=(F0+FLOAT(J-1)*DLATD)*COV                                             
      DX=2.0*RG*COS(F1)*DLON                                                   
      TGA=TAN(F1)/RG

DO L=1,k0
DIVG(II,J,L)=(U(II+1,J,L)-U(i0,J,L))/DX
   &   +(V(II,J+1,L)-V(II,J-1,L))/DY-V(II,J,L)*TGA
ENDDO
ENDDO
iI=i0
DO J=2,j0-1
      F1=(F0+FLOAT(J-1)*DLATD)*COV                                             
      DX=2.0*RG*COS(F1)*DLON                                                   
      TGA=TAN(F1)/RG

DO L=1,k0
DIVG(II,J,L)=(U(1,J,L)-U(II-1,J,L))/DX
c   &       /COS((-87.0+1.0*(j-1))*RAD)/(2*DD)+
   &   +(V(II,J+1,L)-V(II,J-1,L))/DY-V(II,J,L)*TGA
ENDDO
ENDDO
do l=1,k0
CALL BOU1(DIVG(1,1,l),I0,J0)
enddo

C �������ɢ��
DO I=2,i0-1
DO J=2,j0-1
      F1=(F0+FLOAT(J-1)*DLATD)*COV                                             
      DX=2.0*RG*COS(F1)*DLON                                                   
      TGA=TAN(F1)/RG

DIVS(I,J)=(US(I+1,J)-US(I-1,J))/DX
   &+(VS(I,J+1)-VS(I,J-1))/DY-VS(I,J)*TGA
ENDDO
ENDDO
iI=1
DO J=2,j0-1
      F1=(F0+FLOAT(J-1)*DLATD)*COV                                             
      DX=2.0*RG*COS(F1)*DLON                                                   
      TGA=TAN(F1)/RG

DIVS(II,J)=(US(II+1,J)-US(i0,J))/DX
   &+(VS(II,J+1)-VS(II,J-1))/DY-VS(II,J)*TGA
ENDDO
iI=i0
DO J=2,j0-1
      F1=(F0+FLOAT(J-1)*DLATD)*COV                                             
      DX=2.0*RG*COS(F1)*DLON                                                   
      TGA=TAN(F1)/RG

DIVS(II,J)=(US(1,J)-US(II-1,J))/DX
c   &       /COS((-87.0+1.0*(j-1))*RAD)/(2*DD)+
   &   +(VS(II,J+1)-VS(II,J-1))/DY-VS(II,J)*TGA
ENDDO
CALL BOU1(DIVS,I0,J0)

C ���㴹ֱ�ٶ�
do i=1,i0
do j=2,j0-1
IP=ILAY(I,J)
   if(ip.GT.1)THEN
   DO L=1,IP-1
   W(I,J,L)=-9.99E33
   ENDDO
   ELSE
   ENDIF
W(I,J,IP)=WS(I,J)-(DIVS(I,J)+DIVG(I,J,IP))/2*(PP(IP)-PS(I,J))
do L=IP+1,k0
   W(I,J,L)=W(I,J,L-1)-(DIVG(I,J,L-1)+DIVG(I,J,L))/2*DP
ENDDO
   MM=(k0-IP+1)*(k0-IP+2)
DO L=IP,k0
   LL=L-IP+1
   W(I,J,L)=W(I,J,L)-LL*(LL+1)*(W(I,J,k0)-WT(i,j))/REAL(MM)
ENDDO
C ����λ�´�ֱ����
Cif(ip.gt.1)then
Cdo l=1,ip-1
Cwg(i,j,l)=-9.99e33
Cenddo
Celse
Cendif
do l=ip+1,k0-1
wg(i,j,l)=W(I,J,L)*(GTMP(I,J,L+1)-GTMP(I,J,L-1))/2/DP
fw(i,j,l)=W(I,J,L)*(q(I,J,L+1)-q(I,J,L-1))/2/DP
ENDDO
WG(I,J,IP)=W(I,J,IP)*(GTMP(I,J,IP+1)-GTMP(I,J,IP))/DP
WG(I,J,k0)=W(I,J,k0)*(GTMP(I,J,k0)-GTMP(I,J,k0-1))/DP
fW(I,J,IP)=W(I,J,IP)*(q(I,J,IP+1)-q(I,J,IP))/DP
fW(I,J,k0)=W(I,J,k0)*(q(I,J,k0)-q(I,J,k0-1))/DP

ENDDO
ENDDO
do L=ip+1,k0-1
CALL BOU1(WG(1,1,L),I0,J0)
CALL BOU1(fW(1,1,L),I0,J0)
      enddo

C ���������
DO I=1,i0
DO J=2,j0-1
IP=ILAY(I,J)
IF(IP.GT.1)THEN
DO L=1,IP-1
   HT(I,J,L)=9.99e20
   ff(i,j,l)=9.99e20
   tg(i,j,l)=9.99e20
   ug(i,j,l)=9.99e20
   wg(i,j,l)=9.99e20
   ft(i,j,l)=9.99e20
   fv(i,j,l)=9.99e20
   fw(i,j,l)=9.99e20
ENDDO
ELSE
ENDIF
   DO L=IP,k0
wg(i,j,l)=WG(I,J,L)*(PP(L)/1000.0)**CK
ft(i,j,l)=-ft(i,j,l)*lh/cp
fv(i,j,l)=-fv(i,j,l)*lh/cp
fw(i,j,l)=-fw(i,j,l)*lh/cp
   HT(I,J,L)=TG(I,J,L)+UG(I,J,L)+WG(I,J,L)
   ff(I,J,L)=fT(I,J,L)+fv(I,J,L)+fW(I,J,L)
   ENDDO

SS=0.0
sx=0.0
do L=IP,k0-1
SI=(HT(I,J,L)+HT(I,J,L+1))*DP/2.0
SS=SS-SI
Sj=(ff(I,J,L)+ff(I,J,L+1))*DP/2.0
Sx=Sx-Sj
ENDDO

Q1(I,J)=SS/G*100.0*CP
q2(i,j)=sx/g*100.0*cp

ENDDO
ENDDO
do L=ip,k0-1
CALL BOU1(HT(1,1,L),I0,J0)
CALL BOU1(ff(1,1,L),I0,J0)
      enddo
CALL BOU1(q1,I0,J0)
CALL BOU1(q2,I0,J0)

irec=irec+1
write(20,REC=irec)(((tg(I,J,L),I=1,i0),J=1,j0),l=1,k0-1)
write(21,REC=irec)(((ug(I,J,L),I=1,i0),J=1,j0),l=1,k0-1)
write(22,REC=irec)(((wg(I,J,L),I=1,i0),J=1,j0),l=1,k0-1)
write(23,REC=irec)(((w(I,J,L),I=1,i0),J=1,j0),l=1,k0-1)
write(24,REC=irec)(((ft(I,J,L),I=1,i0),J=1,j0),l=1,k0-1)
write(25,REC=irec)(((fv(I,J,L),I=1,i0),J=1,j0),l=1,k0-1)
write(26,REC=irec)(((fw(I,J,L),I=1,i0),J=1,j0),l=1,k0-1)

jrec=jrec+1
write(27,REC=jrec)((q1(I,J),I=1,i0),J=1,j0)
jrec=jrec+1
write(27,REC=jrec)((q2(I,J),I=1,i0),J=1,j0)

      print*,irec,jrec
1999continue

return
end
ccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine smth9(i0,j0,ff,gg)
real ff(i0,j0),gg(i0,j0)
do i=2,i0-1
do j=2,j0-1
s=0.5
gg(i,j)=ff(i,j)+s/2.0*(1-s)*(ff(i+1,j)+ff(i-1,j)+ff(i,j+1)
   & +ff(i,j-1)-4*ff(i,j))+s*s/4*(ff(i+1,J+1)+ff(i-1,j-1)+
   &ff(i+1,j-1)+ff(i-1,j+1)-4*ff(i,j))
enddo
enddo
i=1
do j=2,j0-1
gg(i,j)=ff(i,j)+s/2.0*(1-s)*(ff(i+1,j)+ff(i0,j)+ff(i,j+1)
   & +ff(i,j-1)-4*ff(i,j))+s*s/4*(ff(i+1,J+1)+ff(i0,j-1)+
   &ff(i+1,j-1)+ff(i0,j+1)-4*ff(i,j))
enddo
i=i0
do j=2,j0-1
gg(i,j)=ff(i,j)+s/2.0*(1-s)*(ff(1,j)+ff(i-1,j)+ff(i,j+1)
   & +ff(i,j-1)-4*ff(i,j))+s*s/4*(ff(1,J+1)+ff(i-1,j-1)+
   &ff(i,j-1)+ff(i-1,j+1)-4*ff(i,j))
enddo
j=1
do i=1,i0
gg(i,j)=ff(i,j)
enddo
j=j0
do i=1,i0
gg(i,j)=ff(i,j)
enddo
return
end
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
      SUBROUTINE BOU1(AA,MX,MY)
      DIMENSION AA(MX,MY)
      SS=.125
      M=0
      DO 1 I=2,MX-1
      AA(I,1)=AA(I,2)
      AA(I,MY)=AA(I,MY-1)
1    CONTINUE
      DO 2 J=2,MY-1
      AA(1,J)=AA(2,J)
      AA(MX,J)=AA(MX-1,J)
2    CONTINUE
      AA(1,1)=AA(2,1)
      AA(1,MY)=AA(2,MY)
      AA(MX,1)=AA(MX,2)
      AA(MX,MY)=AA(MX,MY-1)
      RETURN
      END
IDL代码
Q1Q2_Y73: Calculate apparent heat source and moisture sink, after Yanai et al. (1973). Files required:
div_vel_sph.pro
omega_vel.pro
press2alt.pro (by Dominik Brunner)
q1q2_y73.pro地址:http://www.johnny-lin.com/lib.shtml

参考:
http://www.ncl.ucar.edu/Applications/wind.shtml2.
http://read.pudn.com/downloads378/sourcecode/others/1631672/calswa.f__.htm
http://www.johnny-lin.com/lib.shtml


文章来源于微信公众号:气象学家

ColemanJen 发表于 2024-4-27 01:12:49

666
页: [1]
查看完整版本: 气象编程 | 大气视热源Q1和视水汽汇Q2程序