!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer,
! version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer
!version 3 or (at your option) any later version that should be found at:
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software;
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec),
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
***s/r p_apply_tl - TLM of apply consistency with related dynamical variables
*
#include "model_macros_f.h"
*
subroutine p_apply_tl ( F_tdu,F_tdv,F_tdt,F_trm,F_tp,F_qp, 1,15
$ F_tpm,F_trpm,F_qpm,
$ DIST_DIM, Nk)
*
implicit none
*
integer DIST_DIM,Nk
real
$ F_tdu (DIST_SHAPE,Nk), F_tdv (DIST_SHAPE,Nk),
$ F_tdt (DIST_SHAPE,Nk), F_trm (DIST_SHAPE,Nk,*),
$ F_tp (DIST_SHAPE,Nk), F_qp (DIST_SHAPE,Nk),
$ F_tpm (DIST_SHAPE,Nk), F_trpm (DIST_SHAPE,Nk),
$ F_qpm (DIST_SHAPE,Nk)
*
*author
* Stephane Laroche Janvier 2001
*
*revision
* v3_00 - Laroche S. - initial MPI version
* v3_20 - Laroche S. - slight modification to rpn_comm_xch_halo call
* v3_21 - Tanguay M. - Revision Openmp
* v3_30 - Tanguay M. - adapt TL/AD to itf/new tendencies
* - Validation for LAM version
*
*object
* TLM of apply consistency of the tendencies on physics variables
* with related dynamical variables. Interpolate wind
* tendancies toward theirs respective grids.
*
*arguments
* Name I/O Description
*----------------------------------------------------------------
* F_tcond I -
*
*implicits
#include "glb_ld.cdk"
#include "cstv.cdk"
#include "lun.cdk"
#include "hblen.cdk"
#include "dcst.cdk"
#include "schm.cdk"
#include "geomg.cdk"
#include "p_cond.cdk"
#include "intuv.cdk"
#include "inuvl.cdk"
#include "vt0.cdk"
#include "vt1.cdk"
#include "itf_phy_busind.cdk"
#include "v4dg.cdk"
*
*modules
integer vmmlod,vmmget,vmmuld
external vmmlod,vmmget,vmmuld
*
integer*8 pnt_trp(phyt_ntr),pnt_trm(phyt_ntr)
integer i, j, k, n, i0, in, j0, jn, err, key1(10), ng,
$ keyp(phyt_ntr), keym(h2o_ntr), keyp_, keym_
real trajexp
real wk1(LDIST_SHAPE,Nk) , wk2(LDIST_SHAPE,Nk),
$ wk3(LDIST_SHAPE,Nk) , wk4(LDIST_SHAPE,Nk),
$ wk5(LDIST_SHAPE,Nk) , wk6(LDIST_SHAPE,Nk), trp, trm,
$ wk7(LDIST_SHAPE,Nk) ,
$ F_tdum(LDIST_SHAPE,Nk), F_tdvm(LDIST_SHAPE,Nk),
$ F_tdtm(LDIST_SHAPE,Nk), F_trmm(LDIST_SHAPE,Nk),
$ F_st1m(LDIST_SHAPE)
pointer (patrp, trp(LDIST_SHAPE,*)),(patrm, trm(LDIST_SHAPE,*))
*
*notes
* Consistency is applied according to diagnostic relationships
* used at initial time in predat1 and predat2. If changes are
* made to the relations used in these two modules, they should
* be made accordingly here. (xrp**t1 are used as workfields)
**
* __________________________________________________________________
*
if( Schm_wload_L ) call gem_stop
('P_APPLY_TL 1',-1)
if(.not. Schm_pcsty_L ) call gem_stop
('P_APPLY_TL 2',-1)
if(.not. Schm_pheat_L ) call gem_stop
('P_APPLY_TL 3',-1)
*
keyp_ = VMM_KEY (trt1)
if (phyt_ntr.gt.0) then
do n=1,phyt_ntr
keyp(n) = keyp_ + n
end do
err = vmmlod(keyp,phyt_ntr)
do n=1,phyt_ntr
err = vmmget(keyp(n),patrp,trp)
pnt_trp(n) = patrp
end do
endif
*
key1(1) = VMM_KEY(st1 )
key1(2) = VMM_KEY(fipt1)
key1(3) = VMM_KEY(fit1 )
key1(4) = VMM_KEY(tplt1)
key1(5) = VMM_KEY(tpt1 )
key1(6) = VMM_KEY(tdt1 )
key1(7) = VMM_KEY(psdt1)
key1(8) = VMM_KEY(ut1)
key1(9) = VMM_KEY(vt1)
key1(10)= VMM_KEY(tt1)
err = vmmlod (key1,10)
err = VMM_GET_VAR(st1 )
err = VMM_GET_VAR(fipt1)
err = VMM_GET_VAR(fit1 )
err = VMM_GET_VAR(tplt1)
err = VMM_GET_VAR(tpt1 )
err = VMM_GET_VAR(tdt1 )
err = VMM_GET_VAR(psdt1)
err = VMM_GET_VAR(ut1)
err = VMM_GET_VAR(vt1)
err = VMM_GET_VAR(tt1)
*
* 4. Interpolation of the wind associated tendencies
*
* Zero wk5 for hatoprg
* --------------------
wk5 = 0.
*
call itf_phy_uvgridscal
( F_tdu, F_tdv, LDIST_DIM, G_nk, .false. )
*
!$omp parallel
!$omp do
do k=1,l_nk
if ( G_lam .and. ((Hblen_tx.gt.0).or.(Hblen_ty.gt.0)) )
$ wk2(:,:,k) = 0.
wk3(:,:,k) = 0.
wk4(:,:,k) = 0.
end do
!$omp enddo
*
!$omp end parallel
*
* Read TRAJ for the simplified physics
* -------------------------------------
call v4d_rwtraj_apply
(F_tdum,F_tdvm,F_tdtm,F_trmm,F_st1m,LDIST_DIM,Nk)
*
*
* 1.1 Compute VIRTUAL temperature tendency from: temperature tendency,
* specific humidity, virtual temperature & specific humidity tendency
*
!$omp parallel private(trajexp)
*
patrp = pnt_trp(hucond)
*
!$omp do
do k=1,l_nk
do j= 1+pil_s, l_nj-pil_n
do i= 1+pil_w, l_ni-pil_e
*
* TLM
* ---
F_tdt(i,j,k) = F_tdt(i,j,k)*( 1. + Dcst_delta_8*F_trpm(i,j,k) )
$ + trp(i,j,k)*Dcst_delta_8*F_tdtm(i,j,k)
$ + F_tp(i,j,k)*Dcst_delta_8*F_trmm(i,j,k)
$ + F_trm(i,j,k,hucond)*Dcst_delta_8*F_tpm(i,j,k)
*
wk1(i,j,k) = F_tdt(i,j,k)
*
* TRAJECTORY
* ----------
F_tdtm(i,j,k) = F_tdtm(i,j,k)*( 1. + Dcst_delta_8*F_trpm(i,j,k) )
$ + Dcst_delta_8*F_tpm(i,j,k)*F_trmm(i,j,k)
end do
end do
end do
!$omp enddo
*
!$omp single
if ( G_lam .and. ((Hblen_tx.gt.0).or.(Hblen_ty.gt.0)) )
$ call nesajr
(wk1,wk2,LDIST_DIM,G_nk,0,0,Hblen_tx,Hblen_ty)
!$omp end single
*
* 2. Compute d/dt ( phi ) from d/dt ( T )
* Note: d/dt ( phi' ) = d/dt ( phi ) i.e. not computed
* TLM
* ---
!$omp do
do k=1,l_nk
do j= 1+pil_s, l_nj-pil_n
do i= 1+pil_w, l_ni-pil_e
trajexp = exp(F_st1m(i,j) - F_qpm(i,j,k))
F_qp(i,j,k) = F_tdt(i,j,k) *trajexp
$ + st1(i,j) * F_tdtm(i,j,k)*trajexp
$ - F_qp(i,j,k) * F_tdtm(i,j,k)*trajexp
wk5(i,j,k) = F_qp(i,j,k)*Dcst_rgasd_8
end do
end do
end do
!$omp end do
!$omp end parallel
*
ng = (l_maxx-l_minx+1)*(l_maxy-l_miny+1)
call hatoprg
( wk6,wk5,1.0,geomg_hz_8,ng,G_nk )
if ( G_lam .and. ((Hblen_tx.gt.0).or.(Hblen_ty.gt.0)) )
$ call nesajr
(wk6,wk2,LDIST_DIM,G_nk,0,0,Hblen_tx,Hblen_ty)
*
* 3. Compute d/dt ( T'lin ) = pi* d/dt ( T ) exp(s-q) ; put in F_tp
* Note: d/dt ( T' ) = d/dt ( T ) i.e. not computed
!$omp parallel
!$omp do
do k=1,l_nk
do j= 1+pil_s, l_nj-pil_n
do i= 1+pil_w, l_ni-pil_e
F_tp(i,j,k) = geomg_z_8(k)*F_qp(i,j,k)
end do
end do
end do
!$omp end do
*
!$omp end parallel
* 5. Compute total divergence and vertical motion associated tendencies
* d/dt ( total D ) in xrpqt1, d/dt ( pi*-dot ) in wk3
*
call rpn_comm_xch_halo( F_tdu, LDIST_DIM, l_niu, l_nj,G_nk,
$ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
call rpn_comm_xch_halo( F_tdv, LDIST_DIM, l_ni, l_njv,G_nk,
$ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
*
*
* TRAJECTORY
* ----------
call rpn_comm_xch_halo( F_tdum, LDIST_DIM, l_niu, l_nj,G_nk,
$ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
call rpn_comm_xch_halo( F_tdvm, LDIST_DIM, l_ni, l_njv,G_nk,
$ G_halox,G_haloy,G_periodx,G_periody,l_ni,0 )
*
call uv2tdpsd_tl
( F_qp, wk3, F_tdu, F_tdv, st1,
$ wk7, wk4, F_tdum, F_tdvm, F_st1m,
$ LDIST_DIM, G_nk )
if ( G_lam .and. ((Hblen_tx.gt.0).or.(Hblen_ty.gt.0)) ) then
call nesajr
(wk3 ,wk2,LDIST_DIM,G_nk,0,0,Hblen_tx,Hblen_ty)
call nesajr
(F_tp,wk2,LDIST_DIM,G_nk,0,0,Hblen_tx,Hblen_ty)
call nesajr
(F_qp,wk2,LDIST_DIM,G_nk,0,0,Hblen_tx,Hblen_ty)
endif
*
*C 2. apply tendencies to primary variables
* -------------------------------------
if ( G_lam .and. ((Hblen_tx.gt.0).or.(Hblen_ty.gt.0)) ) then
call nesajr
(F_tdu, wk2, LDIST_DIM,G_nk,1,0,Hblen_tx,Hblen_ty)
call nesajr
(F_tdv, wk2, LDIST_DIM,G_nk,0,1,Hblen_tx,Hblen_ty)
endif
*
!$omp parallel
*
!$omp do
do k=1,l_nk
do j= 1+pil_s, l_nj-pil_n
do i= 1+pil_w, l_ni-pil_e
c tt1 (i,j,k) = tt1 (i,j,k) + Cstv_dt_8*F_tdt (i,j,k)
tt1 (i,j,k) = tt1 (i,j,k) + Cstv_dt_8*wk1 (i,j,k)
end do
end do
do j= 1+pil_s, l_nj-pil_n
do i= 1+pil_w, l_niu-pil_e
ut1 (i,j,k) = ut1 (i,j,k) + Cstv_dt_8*F_tdu (i,j,k)
end do
end do
do j= 1+pil_s, l_njv-pil_n
do i= 1+pil_w, l_ni-pil_e
vt1 (i,j,k) = vt1 (i,j,k) + Cstv_dt_8*F_tdv (i,j,k)
end do
end do
end do
!$omp enddo
*
if (phyt_ntr.gt.0) then
do n=1,phyt_ntr
patrp = pnt_trp(n)
!$omp single
if ( G_lam .and. ((Hblen_tx.gt.0).or.(Hblen_ty.gt.0)) ) then
call nesajr
(F_trm(minx,miny,1,n), wk2, LDIST_DIM,G_nk,
$ 0,0,Hblen_tx,Hblen_ty)
endif
!$omp end single
!$omp do
do k=1,l_nk
do j= 1+pil_s, l_nj-pil_n
do i= 1+pil_w, l_ni-pil_e
trp(i,j,k) = trp(i,j,k) + Cstv_dt_8*F_trm(i,j,k,n)
end do
end do
end do
!$omp end do
end do
endif
*
*C 3. apply tendencies to associated variables
* ----------------------------------------
!$omp do
do k=1,l_nk
do j= 1+pil_s, l_nj-pil_n
do i= 1+pil_w, l_ni-pil_e
fit1 (i,j,k) = fit1 (i,j,k) + Cstv_dt_8*wk6 (i,j,k)
fipt1(i,j,k) = fipt1(i,j,k) + Cstv_dt_8*wk6 (i,j,k)
C tpt1 (i,j,k) = tpt1 (i,j,k) + Cstv_dt_8*F_tdt (i,j,k)
tpt1 (i,j,k) = tpt1 (i,j,k) + Cstv_dt_8*wk1 (i,j,k)
tplt1(i,j,k) = tplt1(i,j,k) + Cstv_dt_8*F_tp (i,j,k)
tdt1 (i,j,k) = tdt1 (i,j,k) + Cstv_dt_8*F_qp (i,j,k)
psdt1(i,j,k) = psdt1(i,j,k) + Cstv_dt_8*wk3 (i,j,k)
end do
end do
end do
!$omp end do
*
!$omp end parallel
*
cstl else
cstl*
cstl* NO INTIALIZATION FOR THE TLM AT F_stepno.gt.0 --> F_apply_L=.true.
cstl*
cstl endif
*
* __________________________________________________________________
*
return
end