!-------------------------------------- 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 adw_main_3_intlag_tl - TLM of adw_main_3_intlag when Adw_lag3d_L=.TRUE.
*
#include "model_macros_f.h"
*
subroutine adw_main_3_intlag_tl ( F_u, F_v, F_w, F_um, F_vm, F_wm ) 1,11
*
implicit none
real F_u (*),F_v (*),F_w (*)
real F_um(*),F_vm(*),F_wm(*)
*
*author
* monique tanguay
*
*revision
* v2_31 - Tanguay M. - initial MPI version
* v3_00 - Tanguay M. - adapt to restructured adw_main
* v3_02 - Tanguay M. - restore tracers monotone if V4dg_conf.ne.0
* v3_03 - Tanguay M. - Adjoint NoHyd configuration
* v3_11 - Tanguay M. - introduce key Adw_mono_L
* v3_20 - Tanguay M. - Lagrange 3D
* v3_21 - Tanguay M. - Call adw_main_3_intlag_tl based on Adw_lag3d_L
* v3_30 - Tanguay M. - correct calculation for LAM when Glb_pil gt 7
* v3_31 - Tanguay M. - Introduce time extrapolation
* v3_31 - Tanguay M. - new scope for operator + adw_cliptraj (LAM)
* v3_31 - Tanguay M. - Do adjoint of outsiders in advection
*
*language
* fortran 77
*
*object
* see id section
*
*arguments
*______________________________________________________________________
* | | |
* NAME | DESCRIPTION | I/O |
*--------|-------------------------------------------------------|-----|
* | | |
* | | |
* F_u,F_v| 3 components of upstream positions at t1 at input | iw |
* F_w | used as work field afterward | |
*________|_______________________________________________________|_____|
*
*implicits
#include "glb_ld.cdk"
#include "glb_pil.cdk"
#include "ptopo.cdk"
#include "geomg.cdk"
#include "orh.cdk"
#include "lun.cdk"
#include "schm.cdk"
#include "offc.cdk"
#include "cstv.cdk"
#include "rhsc.cdk"
#include "v4dg.cdk"
#include "adw.cdk"
#include "tr3d.cdk"
#include "vt1.cdk"
#include "vt0.cdk"
#include "adwm.cdk"
#include "rhscm.cdk"
#include "vt1m.cdk"
#include "vt0m.cdk"
*
*modules
integer vmmlod, vmmget, vmmuld
external vmmlod, vmmget, vmmuld
************************************************************************
integer i0,in,j0,jn
integer pnerr, pnlkey1(30), key1(Tr3d_ntr), key0(Tr3d_ntr),
$ key1_, key0_, pnlod, err, dim
integer key1m(Tr3d_ntr), key0m(Tr3d_ntr), key1m_, key0m_
*
integer n, nij, nijk, nijkag, cnt, unf, i,j,k
*
integer*8 pnt_trt1 (Tr3d_ntr),pnt_trt0 (Tr3d_ntr)
integer*8 pnt_trt1m(Tr3d_ntr),pnt_trt0m(Tr3d_ntr)
*
real*8 aaa_8
real tr,tr0,trm,tr0m
pointer (patr, tr (LDIST_SHAPE,*)),(patr0, tr0 (LDIST_SHAPE,*))
pointer (patrm, trm(LDIST_SHAPE,*)),(patr0m, tr0m(LDIST_SHAPE,*))
*
* ______________________________________________________
*
if (Lun_debug_L) write (Lun_out,1000)
nij = l_ni *l_nj
nijk = l_ni *l_nj *l_nk
nijkag = Adw_nit*Adw_njt*l_nk
call hpalloc(Adw_capx1_ ,nijk, err,1)
call hpalloc(Adw_capy1_ ,nijk, err,1)
call hpalloc(Adw_capz1_ ,nijk, err,1)
call hpalloc(Adw_n1_ ,nijk, err,1)
call hpalloc(Adw_xdd1_ ,nijk, err,1)
call hpalloc(Adw_xgg1_ ,nijk, err,1)
call hpalloc(Adw_ydd1_ ,nijk, err,1)
call hpalloc(Adw_ygg1_ ,nijk, err,1)
call hpalloc(Adw_c1_ ,nijk, err,1)
call hpalloc(Adw_wrkb_ ,nijk, err,1)
call hpalloc(Adw_wrkc_ ,nijk, err,1)
*
call hpalloc(Adwm_capx1m_ ,nijk, err,1)
call hpalloc(Adwm_capy1m_ ,nijk, err,1)
call hpalloc(Adwm_capz1m_ ,nijk, err,1)
call hpalloc(Adwm_n1m_ ,nijk, err,1)
call hpalloc(Adwm_xdd1m_ ,nijk, err,1)
call hpalloc(Adwm_xgg1m_ ,nijk, err,1)
call hpalloc(Adwm_ydd1m_ ,nijk, err,1)
call hpalloc(Adwm_ygg1m_ ,nijk, err,1)
call hpalloc(Adwm_c1m_ ,nijk, err,1)
call hpalloc(Adwm_wrkbm_ ,nijk, err,1)
call hpalloc(Adwm_wrkcm_ ,nijk, err,1)
*
i0=1
in=l_ni
j0=1
jn=l_nj
if (G_lam) then
if (l_west) i0=pil_w
if (l_east) in=l_niu - pil_e + 2
if (l_south) j0=pil_s
if (l_north) jn=l_njv - pil_n + 2
call adw_cliptraj_tl
( F_u, F_v, F_um, F_vm, i0, in, j0, jn, 'IN3_TL')
endif
*
if (.not.G_lam) then
*
call adw_exch_1_tl
( Adw_n1, Adw_xgg1, Adw_xdd1, Adw_c1,
$ F_u, F_v, F_w,
$ Adwm_n1m,Adwm_xgg1m, Adwm_xdd1m, Adwm_c1m,
$ F_um, F_vm, F_wm )
*
dim = max(1,Adw_fro_a)
*
call hpalloc(Adwm_capx2m_ ,dim, err,1)
call hpalloc(Adwm_capy2m_ ,dim, err,1)
call hpalloc(Adwm_capz2m_ ,dim, err,1)
call hpalloc(Adwm_wrkam_ ,dim, err,1)
*
call hpalloc(Adw_capx2_ ,dim, err,1)
call hpalloc(Adw_capy2_ ,dim, err,1)
call hpalloc(Adw_capz2_ ,dim, err,1)
call hpalloc(Adw_wrka_ ,dim, err,1)
*
call adw_exch_2_tl
( Adw_capx2, Adw_capy2, Adw_capz2,
% Adw_n1, Adw_xgg1, Adw_xdd1,
% Adwm_capx2m,Adwm_capy2m,Adwm_capz2m,
% Adwm_n1m, Adwm_xgg1m, Adwm_xdd1m,
% Adw_fro_n, Adw_fro_s, Adw_fro_a,
% Adw_for_n, Adw_for_s, Adw_for_a, 3 )
*
if ( Adw_fro_a .gt. 0 .and. Adw_ckbd_L )
$ call adw_ckbd
( Adwm_capy2m )
endif
*
***********************************************************************
* Perform interpolation
***********************************************************************
pnlkey1(1) = VMM_KEY(ruw1)
pnlkey1(2) = VMM_KEY(rvw1)
pnlkey1(3) = VMM_KEY(ruw2)
pnlkey1(4) = VMM_KEY(rvw2)
pnlkey1(5) = VMM_KEY(rcn)
pnlkey1(6) = VMM_KEY(rth)
pnlod = 6
*
if (.not. Schm_hydro_L) then
pnlkey1(1+pnlod) = VMM_KEY(rw)
pnlkey1(2+pnlod) = VMM_KEY(rvv)
pnlod = 2+pnlod
endif
*
pnlkey1(1+pnlod) = VMM_KEY(ruw1m)
pnlkey1(2+pnlod) = VMM_KEY(rvw1m)
pnlkey1(3+pnlod) = VMM_KEY(ruw2m)
pnlkey1(4+pnlod) = VMM_KEY(rvw2m)
pnlkey1(5+pnlod) = VMM_KEY(rcnm)
pnlkey1(6+pnlod) = VMM_KEY(rthm)
pnlod = 6+pnlod
*
if (.not. Schm_hydro_L) then
pnlkey1(1+pnlod) = VMM_KEY(rwm)
pnlkey1(2+pnlod) = VMM_KEY(rvvm)
pnlod = 2+pnlod
endif
*
pnerr = vmmlod(pnlkey1,pnlod)
*
pnerr = VMM_GET_VAR(ruw1)
pnerr = VMM_GET_VAR(rvw1)
pnerr = VMM_GET_VAR(ruw2)
pnerr = VMM_GET_VAR(rvw2)
pnerr = VMM_GET_VAR(rcn)
pnerr = VMM_GET_VAR(rth)
*
if (.not. Schm_hydro_L) then
pnerr = VMM_GET_VAR(rw)
pnerr = VMM_GET_VAR(rvv)
endif
*
pnerr = VMM_GET_VAR(ruw1m)
pnerr = VMM_GET_VAR(rvw1m)
pnerr = VMM_GET_VAR(ruw2m)
pnerr = VMM_GET_VAR(rvw2m)
pnerr = VMM_GET_VAR(rcnm)
pnerr = VMM_GET_VAR(rthm)
*
if (.not. Schm_hydro_L) then
pnerr = VMM_GET_VAR(rwm)
pnerr = VMM_GET_VAR(rvvm)
endif
*
if (Tr3d_ntr.gt.0) then
key1_ = VMM_KEY (trt1)
key0_ = VMM_KEY (trt0)
key1m_= VMM_KEY (trt1m)
key0m_= VMM_KEY (trt0m)
do n=1,Tr3d_ntr
key1 (n) = key1_ + n
key0 (n) = key0_ + n
key1m(n) = key1m_+ n
key0m(n) = key0m_+ n
end do
err = vmmlod(key1, Tr3d_ntr)
err = vmmlod(key0, Tr3d_ntr)
err = vmmlod(key1m,Tr3d_ntr)
err = vmmlod(key0m,Tr3d_ntr)
do n=1,Tr3d_ntr
err = vmmget(key1 (n),patr, tr)
err = vmmget(key1m(n),patrm,trm)
pnt_trt1 (n) = patr
pnt_trt1m(n) = patrm
err = vmmget(key0 (n),patr0, tr0)
err = vmmget(key0m(n),patr0m,tr0m)
pnt_trt0 (n) = patr0
pnt_trt0m(n) = patr0m
end do
endif
*
* ----------------------------
* Keep positions in CAP fields
* ----------------------------
!$omp parallel private(n)
*
!$omp do
do k=1,l_nk
do j=j0,jn
do i=i0,in
n = (k-1)*nij + ((j-1)*l_ni) + i
*
* TRAJECTORY
* ----------
Adwm_capx1m(n) = F_um(n)
Adwm_capy1m(n) = F_vm(n)
Adwm_capz1m(n) = F_wm(n)
*
* TLM
* ---
Adw_capx1(n) = F_u(n)
Adw_capy1(n) = F_v(n)
Adw_capz1(n) = F_w(n)
end do
end do
end do
!$omp end do
*
call adw_interp2_tl
(ruw2, ruw1, F_u, F_v,
% ruw2m,ruw1m,F_um,F_vm,
% .true., .false., LDIST_DIM, l_nk,i0,in,j0,jn)
*
call adw_interp2_tl
(rvw2, rvw1, F_u, F_v,
% rvw2m,rvw1m,F_um,F_vm,
% .true., .false., LDIST_DIM, l_nk,i0,in,j0,jn)
*
call adw_interp2_tl
(rcn, rcn, F_u, F_v,
% rcnm,rcnm,F_um,F_vm,
% .false., .false., LDIST_DIM, l_nk,i0,in,j0,jn)
*
call adw_interp2_tl
(rth, rth, F_u, F_v,
% rthm,rthm,F_um,F_vm,
% .false., .false., LDIST_DIM, l_nk,i0,in,j0,jn)
*
if (.not. Schm_hydro_L) then
call adw_interp2_tl
(rw, rw, F_u, F_v,
% rwm,rwm,F_um,F_vm,
% .false., .false., LDIST_DIM, l_nk,i0,in,j0,jn)
*
call adw_interp2_tl
(rvv, rvv, F_u, F_v,
% rvvm,rvvm,F_um,F_vm,
% .false., .false., LDIST_DIM, l_nk,i0,in,j0,jn)
endif
*
if ( Orh_icn .eq. Schm_itcn. or. .not.Orh_crank_L ) then
*
* tr3d advection
*
aaa_8 = ( Offc_a1_8 / Offc_b0_8 )/ Cstv_dt_8
*
do n=1,Tr3d_ntr
patr = pnt_trt1 (n)
patr0 = pnt_trt0 (n)
patrm = pnt_trt1m(n)
patr0m= pnt_trt0m(n)
!$omp do
do k=1,G_nk
do j=1,l_nj
do i=1,l_ni
* TRAJECTORY
* ----------
tr0m(i,j,k) = - aaa_8*trm(i,j,k)
*
* TLM
* ---
tr0(i,j,k) = - aaa_8*tr(i,j,k)
end do
end do
end do
!$omp end do
call adw_interp2_tl
( tr0, tr0, F_u, F_v,
% tr0m,tr0m,F_um,F_vm,
% .false., Adw_mono_L, LDIST_DIM, l_nk,i0,in,j0,jn)
!$omp do
do k=1,G_nk
do j=1,l_nj
do i=1,l_ni
* TRAJECTORY
* ----------
tr0m(i,j,k) = Cstv_tau_8*tr0m(i,j,k)
*
* TLM
* ---
tr0(i,j,k) = Cstv_tau_8*tr0(i,j,k)
end do
end do
end do
!$omp end do
end do
*
endif
!$omp end parallel
***********************************************************************
* Deallocate
***********************************************************************
call hpdeallc(Adw_capx1_ ,err,1)
call hpdeallc(Adw_capy1_ ,err,1)
call hpdeallc(Adw_capz1_ ,err,1)
call hpdeallc(Adw_n1_ ,err,1)
call hpdeallc(Adw_xdd1_ ,err,1)
call hpdeallc(Adw_xgg1_ ,err,1)
call hpdeallc(Adw_ydd1_ ,err,1)
call hpdeallc(Adw_ygg1_ ,err,1)
call hpdeallc(Adw_c1_ ,err,1)
call hpdeallc(Adw_wrkb_ ,err,1)
call hpdeallc(Adw_wrkc_ ,err,1)
*
call hpdeallc(Adwm_capx1m_ ,err,1)
call hpdeallc(Adwm_capy1m_ ,err,1)
call hpdeallc(Adwm_capz1m_ ,err,1)
call hpdeallc(Adwm_n1m_ ,err,1)
call hpdeallc(Adwm_xdd1m_ ,err,1)
call hpdeallc(Adwm_xgg1m_ ,err,1)
call hpdeallc(Adwm_ydd1m_ ,err,1)
call hpdeallc(Adwm_ygg1m_ ,err,1)
call hpdeallc(Adwm_c1m_ ,err,1)
call hpdeallc(Adwm_wrkbm_ ,err,1)
call hpdeallc(Adwm_wrkcm_ ,err,1)
if (.not.G_lam) then
*
call hpdeallc(Adw_capx2_ ,err,1)
call hpdeallc(Adw_capy2_ ,err,1)
call hpdeallc(Adw_capz2_ ,err,1)
call hpdeallc(Adw_wrka_ ,err,1)
*
call hpdeallc(Adwm_capx2m_ ,err,1)
call hpdeallc(Adwm_capy2m_ ,err,1)
call hpdeallc(Adwm_capz2m_ ,err,1)
call hpdeallc(Adwm_wrkam_ ,err,1)
*
endif
*
pnerr = vmmuld(-1,0)
*
1000 format(3X,'TLM of ADVECT THE RIGHT-HAND-SIDES: (S/R ADW_MAIN_3_INTLAG_TL)')
*
return
end