22 & lsidea,IM,KM,A,B,C,U1,V1,DT,CP,LEVR,pgr,PRSL,PRSLRD0,ral_ts, &
23 & ldiag3d,dtend,dtidx,index_of_process_rayleigh_damping, &
24 & index_of_temperature,index_of_x_wind,index_of_y_wind, &
63 USE machine ,
ONLY : kind_phys
66 logical,
intent(in) :: lsidea,ldiag3d
67 integer,
intent(in) :: im, km,levr
68 real(kind=kind_phys),
intent(in) :: dt, cp, prslrd0, ral_ts
69 real(kind=kind_phys),
intent(in) :: pgr(:), prsl(:,:)
70 real(kind=kind_phys),
intent(in) :: u1(:,:), v1(:,:)
71 real(kind=kind_phys),
intent(inout) :: a(:,:), b(:,:), c(:,:)
72 real(kind=kind_phys),
optional,
intent(inout) :: dtend(:,:,:)
73 integer,
intent(in) :: dtidx(:,:)
74 integer,
intent(in) :: &
75 & index_of_process_rayleigh_damping, index_of_temperature, &
76 & index_of_x_wind, index_of_y_wind
77 character(len=*),
intent(out) :: errmsg
78 integer,
intent(out) :: errflg
81 real(kind=kind_phys),
parameter :: cons1=1.0, cons2=2.0, half=0.5
82 real(kind=kind_phys) dtaux, dtauy, wrk1, rtrd1, rfactrd, wrk2
83 &, eng0, eng1, tem1, tem2, dti, hfbcpdt, rtrd
84 real(kind=kind_phys) tx1(im), deltaa, deltab, deltac
85 integer i, k, uidx,vidx,tidx
88 uidx=dtidx(index_of_x_wind,index_of_process_rayleigh_damping)
89 vidx=dtidx(index_of_y_wind,index_of_process_rayleigh_damping)
90 tidx=dtidx(index_of_temperature, &
91 & index_of_process_rayleigh_damping)
102 if (lsidea .or. ral_ts <= 0.0 .or. prslrd0 == 0.0)
return
104 rtrd1 = 1.0/(ral_ts*86400)
107 hfbcpdt = half / (cp*dt)
110 IF(prsl(1,k) < prslrd0)
THEN
111 wrk1 = log(prslrd0/prsl(1,k))
113 rtrd = rtrd1 * wrk1 * wrk1
121 rfactrd = cons1 / (cons1+dt*rtrd) - cons1
122 dtaux = u1(i,k) * rfactrd
123 dtauy = v1(i,k) * rfactrd
124 eng0 = u1(i,k)*u1(i,k) + v1(i,k)*v1(i,k)
125 tem1 = u1(i,k) + dtaux
126 tem2 = v1(i,k) + dtauy
127 eng1 = tem1*tem1 + tem2*tem2
130 deltac = max((eng0-eng1),0.0) * hfbcpdt
131 a(i,k) = a(i,k) + deltaa
132 b(i,k) = b(i,k) + deltab
133 c(i,k) = c(i,k) + deltac
135 dtend(i,k,vidx) = dtend(i,k,vidx) + deltaa
138 dtend(i,k,uidx) = dtend(i,k,uidx) + deltab
141 dtend(i,k,tidx) = dtend(i,k,tidx) + deltac
subroutine rayleigh_damp_run(lsidea, im, km, a, b, c, u1, v1, dt, cp, levr, pgr, prsl, prslrd0, ral_ts, ldiag3d, dtend, dtidx, index_of_process_rayleigh_damping, index_of_temperature, index_of_x_wind, index_of_y_wind, errmsg, errflg)