94 subroutine rtsig(lusig,head,k1,k2,kgds,ijo,levs,ntrac,jcap,lnt2,me, &
95 h,p,px,py,t,u,v,d,trc,iret)
97 use sigio_module
, only : sigio_intkind, sigio_head
98 use sigio_r_module
, only : sigio_dati, sigio_rrdati
102 integer(sigio_intkind),
intent(in) :: lusig
103 type(sigio_head
),
intent(in) :: head
104 integer,
intent(in) :: k1,k2,kgds(200),ijo,levs,ntrac,jcap,lnt2,me
105 real,
dimension(ijo),
intent(out) :: h,p,px,py
106 real,
dimension(ijo,k1:k2),
intent(out):: t,u,v,d
107 real,
dimension(ijo,k1:k2,ntrac),
intent(out),
target :: trc
108 integer,
intent(out) :: iret
110 integer idrt,io,jo,iidea
112 integer(sigio_intkind):: irets
114 type(sigio_dati
) dati
119 real,
target :: trisca(lnt2,k1:k2+1), triscb(lnt2,k1:k2)
120 real,
dimension(:),
allocatable :: cpi
121 real,
dimension(:,:),
allocatable :: wrk
122 integer io3,ict,jct,n,i,k,jc,nt
129 if(kgds(1) == 0 .and. kgds(4) < 90000) idrt = 256
136 print*,
'Debug rtsig= ',lusig,k1,k2,ijo,kgds(1:20)
147 dati%f => trisca(:,k1)
148 call sigio_rrdati(lusig,head,dati,irets)
149 if(irets /= 0)
return
157 dati%f => trisca(:,k1+1)
158 call sigio_rrdati(lusig,head,dati,irets)
159 if(irets /= 0)
return
165 call sptezm(0,jcap,idrt,io,jo,2,trisca(1,k1),wrk,1)
166 if( mod(idvm,10) < 2)
then
170 p(i) = 1.e3*exp(wrk(i,2))
173 elseif(mod(idvm,10) == 2)
then
177 p(i) = 1000.*wrk(i,2)
181 if (
allocated(wrk))
deallocate(wrk)
183 call sptezd(0,jcap,idrt,io,jo,trisca(1,k1+1),pmean,px,py,1)
194 write(*,*)
' retriving T for k=',k,
' k1=',k1,
' k2=',k2
196 dati%f => trisca(:,k)
198 call sigio_rrdati(lusig,head,dati,iret)
200 call sptezm(0,jcap,idrt,io,jo,klen,trisca(1,k1),t(1,k1),1)
203 dati%i = levs + 2 + (k-1) * 2 + 1
204 dati%f => trisca(:,k)
205 call sigio_rrdati(lusig,head,dati,irets)
206 if(irets /= 0)
return
207 dati%i = levs + 2 + (k-1) * 2 + 2
208 dati%f => triscb(:,k)
209 call sigio_rrdati(lusig,head,dati,irets)
210 if(irets /= 0)
return
212 call sptezmv(0,jcap,idrt,io,jo,klen,trisca(1,k1),triscb(1,k1), &
214 call sptezm(0,jcap,idrt,io,jo,klen,trisca(1,k1),d(1,k1),1)
217 write(*,*)
' retriving d/z for k=',k,
' k1=',k1,
' k2=',k2
220 write(*,*)
' start get tracer'
223 dati%i = levs * (2+nt) + 2 + k
224 dati%f => trisca(:,k)
225 call sigio_rrdati(lusig,head,dati,irets)
227 call sptezm(0,jcap,idrt,io,jo,klen,trisca(1,k1),trc(1,k1,nt),1)
228 write(*,*)
' retriving d/z for nt=',nt,
'ntrac=',ntrac,
'k=',k,
' k1=',k1,
' k2=',k2
231 write(*,*)
' end get tracer,idvm=',idvm,
'ijo=',ijo,
'ntrac=',ntrac
234 if (mod(idvm/10,10) == 3)
then
235 allocate(cpi(0:ntrac))
237 cpi(0:ntrac) = head%cpi(1:ntrac+1)
245 if( cpi(n) /= 0.0 )
then
246 xcp = xcp + cpi(n)*trc(i,k,n)
247 sumq = sumq + trc(i,k,n)
250 xcp = (1.-sumq)*cpi(0) + xcp
251 t(i,k) = t(i,k) / xcp
254 if (
allocated(cpi))
deallocate(cpi)
259 t(i,k) = t(i,k) / (1+con_fvirt*trc(i,k,1))
297 subroutine modstuff(km,idvc,idsl,nvcoord,vcoord,ps,psx,psy,d,u,v,&
299 use sigio_module
, only: sigio_modprd
301 integer,
intent(in):: km,idvc,idsl,nvcoord
302 real,
intent(in):: vcoord(km+1,nvcoord)
303 real,
intent(in):: ps,psx,psy
304 real,
intent(in):: u(km),v(km),d(km)
306 real*8,
intent(out):: pi(km+1),pm(km)
307 real,
intent(out):: om(km)
308 real*8 ps8,pm8(km),pd8(km),vcoord8(km+1,nvcoord)
309 real*8 dpmdps(km),dpddps(km),dpidps(km+1),pi8(km+1)
310 real vgradp,pd(km),px(km),py(km),os
315 call sigio_modprd(1,1,km,nvcoord,idvc,idsl,vcoord8,iret,&
317 pm=pm8,pd=pd8,dpmdps=dpmdps,dpddps=dpddps)
325 pi8(k+1)=pi8(k)-pd8(k)
326 dpidps(k+1)=dpidps(k)-dpddps(k)
335 vgradp=u(k)*psx+v(k)*psy
336 os=os-vgradp*ps*(dpmdps(k)-dpidps(k+1))-d(k)*(pm(k)-pi(k+1))
337 om(k)=vgradp*ps*dpmdps(k)+os
338 os=os-vgradp*ps*(dpidps(k)-dpmdps(k))-d(k)*(pi(k)-pm(k))
376 subroutine modstuff2(im,ix,km,idvc,idsl,nvcoord,vcoord,ps,psx,psy,d,u,v,&
378 use sigio_module
, only : sigio_modprd
380 integer,
intent(in) :: im,ix,km,idvc,idsl,nvcoord,me
381 real,
intent(in) :: vcoord(km+1,nvcoord)
382 real,
dimension(ix),
intent(in) :: ps,psx,psy
383 real,
dimension(ix,km),
intent(in) :: u,v,d
384 real*8,
dimension(ix,km+1),
intent(out) :: pi
385 real*8,
dimension(ix,km),
intent(out) :: pm
386 real,
dimension(ix,km),
intent(out) :: om
394 real*8 ps8(ix),pm8(ix,km),pd8(ix,km),vcoord8(km+1,nvcoord)
395 real*8 dpmdps(ix,km),dpddps(ix,km),dpidps(ix,km+1),pi8(ix,km+1)
396 real vgradpps,pd(im,km),os(im)
398 integer i,k,iret,logk
403 call sigio_modprd(im,ix,km,nvcoord,idvc,idsl,vcoord8,iret, &
404 ps=ps8,pd=pd8,dpddps=dpddps,pm=pm8,dpmdps=dpmdps)
423 pi8(i,k+1) = pi8(i,k) - pd8(i,k)
424 dpidps(i,k+1) = dpidps(i,k) - dpddps(i,k)
428 pi(i,k+1) = pi8(i,k+1)
436 vgradpps = (u(i,k)*psx(i) + v(i,k)*psy(i)) * ps(i)
438 os(i) = os(i) - vgradpps*(dpmdps(i,k)-dpidps(i,k+1)) &
439 - d(i,k)*(pm(i,k)-pi(i,k+1))
441 om(i,k) = os(i) + vgradpps*dpmdps(i,k)
443 os(i) = os(i) - vgradpps*(dpidps(i,k)-dpmdps(i,k)) &
444 - d(i,k)*(pi(i,k)-pm(i,k))
497 subroutine trssc(jcap,nc,km,ntrac,idvc,idvm,idsl,nvcoord,vcoord, &
498 cpi,idrt,lonb,latb,ijl,ijn,j1,j2,jc,chgq0, &
499 szs,sps,st,sd,sz,sq,gfszs,gfsps,gfsp,gfsdp, &
500 gfst,gfsu,gfsv,gfsq,gfsw)
502 integer,
intent(in)::jcap,nc,km,ntrac,idvc,idvm,idsl,nvcoord,idrt,lonb,latb
503 integer,
intent(in)::ijl,ijn,j1,j2,jc,chgq0
504 real,
intent(in):: szs(nc),sps(nc),st(nc,km),sd(nc,km),sz(nc,km),sq(nc,km*ntrac)
505 real,
intent(in):: cpi(0:ntrac)
506 real*8,
intent(in):: vcoord(km+1,nvcoord)
507 real,
dimension(ijn),
intent(inout):: gfszs,gfsps
508 real,
dimension(ijn,km),
intent(inout):: gfsp,gfsdp,gfst,gfsu,gfsv,gfsw
509 real,
dimension(ijn,km*ntrac),
intent(inout):: gfsq
510 real zs(ijl),ps(ijl),t(ijl,km),u(ijl,km),v(ijl,km),q(ijl,km*ntrac)
511 real wi(ijl,km),pi(ijl,km),dpo(ijl,km)
513 integer thermodyn_id,jn,js,is,in
514 integer jj,jjm,k,n,j,i,ij,lonb2
517 if(j1==732)print*,
'sample input to trssc= ',jcap,nc,km,ntrac, &
518 idvc,idvm,idsl,nvcoord, &
519 idrt,lonb,latb,ijl,ijn,j1,j2,jc,chgq0
524 call sptran(0,jcap,idrt,lonb,latb,1,1,1,lonb2,lonb2,nc,ijl, &
525 j1,j2,jc,szs,zs(in),zs(is),1)
526 call sptran(0,jcap,idrt,lonb,latb,1,1,1,lonb2,lonb2,nc,ijl, &
527 j1,j2,jc,sps,ps(in),ps(is),1)
528 call sptran(0,jcap,idrt,lonb,latb,km,1,1,lonb2,lonb2,nc,ijl, &
529 j1,j2,jc,st,t(in,1),t(is,1),1)
530 call sptranv(0,jcap,idrt,lonb,latb,km,1,1,lonb2,lonb2,nc,ijl, &
531 j1,j2,jc,sd,sz,u(in,1),u(is,1),v(in,1),v(is,1),1)
532 call sptran(0,jcap,idrt,lonb,latb,km*ntrac,1,1,lonb2,lonb2,nc,ijl, &
533 j1,j2,jc,sq,q(in,1),q(is,1),1)
537 if(t(i,k)>400. .or. t(i,k)<100.)print*,
'bad T from sptran',i,k,t(i,k)
538 if(q(i,k)>1.)print*,
'bad Q from sptran',i,k,q(i,k)
539 if(q(i,2*k)>1.)print*,
'bad Q from sptran',i,k,q(i,2*k)
540 if(q(i,3*k)>1.)print*,
'bad Q from sptran',i,k,q(i,3*k)
544 select case(mod(idvm,10))
547 ps(i)=1.e3*exp(ps(i))
555 ps(i)=1.e3*exp(ps(i))
559 thermodyn_id=mod(idvm/10,10)
560 if (thermodyn_id == 3)
then
563 t(i,k) = t(i,k)/cpi(0)
569 call
getomega(jcap,nc,km,idvc,idvm,idrt,idsl, &
570 nvcoord,vcoord,lonb,latb,ijl,j1,j2,1,sd,sps, &
575 if(t(i,k)>400. .or. t(i,k)<100.)print*,
'bad T after getomega',i,k,t(i,k)
576 if(q(i,k)>1. )print*,
'bad Q after getomega',i,k,q(i,k)
577 if(q(i,2*k)>1. )print*,
'bad Q after getomega',i,2*k,q(i,2*k)
581 if(thermodyn_id /= 2)
then
583 if (thermodyn_id == 3)
then
589 if( cpi(n) /= 0.0 )
then
590 xcp = xcp + cpi(n)*q(i,k+(n-1)*km)
591 sumq = sumq + q(i,k+(n-1)*km)
594 t(i,k) = t(i,k)/((1.-sumq)*cpi(0)+xcp)
599 tvcon=(461.50/287.05-1.)
600 t(:,:) = t(:,:)/(1.+tvcon*q(:,1:km))
606 if(t(i,k)>400. .or. t(i,k)<100.)print*,
'bad T after Tv to T',i,k,t(i,k)
607 if(q(i,k)>1.)print*,
'bad Q after Tv to T',i,k,q(i,k)
608 if(q(i,2*k)>1. )print*,
'bad Q after Tv to T',i,k,q(i,2*k)
614 if (chgq0 == 1) q = max(q, 0.0)
625 gfszs(i+jn) = zs(i+jjm)
626 gfsps(i+jn) = ps(i+jjm)
629 gfszs(i+js) = zs(i+jj)
630 gfsps(i+js) = ps(i+jj)
634 gfsdp(i+jn,k) = dpo(i+jjm,k)
635 gfsp(i+jn,k) = pi(i+jjm,k)
636 gfst(i+jn,k) = t(i+jjm,k)
637 gfsu(i+jn,k) = u(i+jjm,k)
638 gfsv(i+jn,k) = v(i+jjm,k)
639 gfsw(i+jn,k) = wi(i+jjm,k)
642 gfsdp(i+js,k) = dpo(i+jj,k)
643 gfsp(i+js,k) = pi(i+jj,k)
644 gfst(i+js,k) = t(i+jj,k)
645 gfsu(i+js,k) = u(i+jj,k)
646 gfsv(i+js,k) = v(i+jj,k)
647 gfsw(i+js,k) = wi(i+jj,k)
652 gfsq(i+jn,k) = q(i+jjm,k)
655 gfsq(i+js,k) = q(i+jj,k)
689 subroutine getomega(jcap,nc,km,idvc,idvm,idrt,idsl,nvcoord,vcoord, &
690 lonb,latb,ijn,j1,j2,jc,sd,sps,psi,ti,ui,vi,wi,pm,pd)
692 use sigio_module
, only : sigio_modprd
695 integer,
intent(in):: jcap,nc,km,idvc,idvm,idrt,idsl,nvcoord
696 integer,
intent(in):: lonb,latb,j1,j2,jc,ijn
697 real*8,
intent(in):: vcoord(km+1,nvcoord)
698 real,
intent(in):: sd(nc,km),sps(nc)
699 real,
intent(in):: psi(ijn),ti(ijn,km),ui(ijn,km),vi(ijn,km)
700 real,
intent(out):: wi(ijn,km),pm(ijn,km),pd(ijn,km)
703 real*8 psi8(ijn),ti8(ijn,km),pm8(ijn,km),pd8(ijn,km)
704 real*8 dpmdps(ijn,km),dpddps(ijn,km),dpidps(ijn,km+1),vgradp,psmean
705 real di(ijn,km),psx(ijn),psy(ijn)
706 integer k,i,ij,lonb2,iret,is,in
712 call sptrand(0,jcap,idrt,lonb,latb,1,1,1,lonb2,lonb2,nc,ijn, &
713 j1,j2,jc,sps,psmean,psx(in),psx(is),psy(in),psy(is),1)
715 call sptran(0,jcap,idrt,lonb,latb,km,1,1,lonb2,lonb2,nc,ijn, &
716 j1,j2,jc,sd,di(in,1),di(is,1),1)
720 call sigio_modprd(ijn,ijn,km,nvcoord,idvc,idsl,vcoord,iret, &
721 ps=psi8,t=ti8,pm=pm8,pd=pd8,dpmdps=dpmdps,dpddps=dpddps)
725 select case(mod(idvm,10))
730 psx(i)=psx(i)/(psi(i)*1.0e-3)
731 psy(i)=psy(i)/(psi(i)*1.0e-3)
747 pi(i,k+1)=pi(i,k)-pd(i,k)
748 dpidps(i,k+1)=dpidps(i,k)-dpddps(i,k)
754 vgradp=ui(i,k)*psx(i)+vi(i,k)*psy(i)
755 os=os-vgradp*psi(i)*(dpmdps(i,k)-dpidps(i,k+1))- &
756 di(i,k)*(pm(i,k)-pi(i,k+1))
757 wi(i,k)=vgradp*psi(i)*dpmdps(i,k)+os
758 os=os-vgradp*psi(i)*(dpidps(i,k)-dpmdps(i,k))- &
759 di(i,k)*(pi(i,k)-pm(i,k))
subroutine rtsig(lusig, head, k1, k2, kgds, ijo, levs, ntrac, jcap, lnt2, me, h, p, px, py, t, u, v, d, trc, iret)
rtsig() reads and transforms sigma file.
subroutine modstuff2(im, ix, km, idvc, idsl, nvcoord, vcoord, ps, psx, psy, d, u, v, pi, pm, om, me)
modstuff2() computes model coordinate dependent functions.
subroutine getomega(jcap, nc, km, idvc, idvm, idrt, idsl, nvcoord, vcoord, lonb, latb, ijn, j1, j2, jc, sd, sps, psi, ti, ui, vi, wi, pm, pd)
getomega() computes omega.
subroutine modstuff(km, idvc, idsl, nvcoord, vcoord, ps, psx, psy, d, u, v, pi, pm, om)
modstuff() computes model coordinate dependent functions.
subroutine trssc(jcap, nc, km, ntrac, idvc, idvm, idsl, nvcoord, vcoord, cpi, idrt, lonb, latb, ijl, ijn, j1, j2, jc, chgq0, szs, sps, st, sd, sz, sq, gfszs, gfsps, gfsp, gfsdp, gfst, gfsu, gfsv, gfsq, gfsw)
trssc() transforms sigma spectral fields to grid.