!-------------------------------------- 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_setint_ad - ADJ of adw_setint_tl * #include "model_macros_f.h"*
subroutine adw_setint_ad ( F_n, 5 % F_capx, F_xgg, F_xdd, % F_capy, F_ygg, F_ydd, % F_capz, F_cz, % F_x, F_y, F_z, % F_xm, F_ym, F_zm, % F_h_L, F_z_L, F_lin_L, F_num,i0,in,j0,jn,kn) * implicit none * integer F_num, F_n(F_num),i0,in,j0,jn,kn * real F_capx(F_num), F_xgg(F_num), F_xdd(F_num) real F_capy(F_num), F_ygg(F_num), F_ydd(F_num) real F_capz(F_num), F_cz (F_num) real F_x (F_num), F_y (F_num), F_z (F_num) * logical F_h_L, F_z_L, F_lin_L * real F_xm (F_num), F_ym (F_num), F_zm (F_num) * *author * monique tanguay * *revision * v2_31 - Tanguay M. - initial MPI version * v3_00 - Tanguay M. - adapt to restructured adw_main * v3_11 - Tanguay M. - AIXport+Opti+OpenMP for TLM-ADJ * v3_20 - Tanguay M. - Correction for haloy.gt.2 * *language * fortran 77 * *object * see id section * * *ADJ of *arguments *______________________________________________________________________ * | | | * NAME | DESCRIPTION | I/O | *--------------|-------------------------------------------------|-----| * | | | * F_n | positions in the 3D volume of interpolation | o | * | boxes | | * | | | * F_capx | \ | o | * F_xgg | precomputed displacements and interpolation | o | * F_xdd | / terms along the x-direction | o | * | | | * F_capy | \ | o | * F_ygg | precomputed displacements and interpolation | o | * F_ydd | / terms along the y-direction | o | * | | | * F_capz | \ precomputed displacements and interpolation | o | * F_cz | / terms along the z-direction | o | * | | | * F_x | x coordinate of upstream position | i | * F_y | y coordinate of upstream position | i | * F_z | z coordinate of upstream position | i | * | | | * F_h_L | switch: .true. :compute horizontal parameters | i | * F_z_L | switch: .true. :compute vertical parameters | i | * F_lin_L | switch: .true. :compute interpolation parameters| i | * | only for linear interpolation | | * | | | * F_num | number of points to treat | i | *______________|_________________________________________________|_____| *implicits #include "glb_ld.cdk"
#include "adw.cdk"
* ************************************************************************ integer n, ii, jj, kk, ij, nijag, nij,i, j, k real*8 prd_8, prdt_8 real*8 prdm_8,prdtm_8 * real F_capzm1 * real *8 ZERO_8 parameter (ZERO_8 = 0.0) * nij = l_ni * l_nj nijag = Adw_nit * Adw_njt ************************************************************************ * !$omp parallel private(n,prd_8,prdm_8,ii,prdt_8,prdtm_8, !$omp% jj,kk,ij,F_capzm1) * if ( F_h_L .and. F_z_L ) then ************************************************************************ if ( F_lin_L ) then !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * TRAJECTORY * ---------- prdm_8 = dble(F_zm(n)) kk = ( prdm_8 - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) prdm_8 = prdm_8 - Adw_bsz_8(kk) if ( prdm_8 .lt. 0.0 ) kk = kk - 1 * * ADJ * --- F_n (n) = ZERO_8 F_z (n) = F_capz(n) * Adw_diz_8(kk) + F_z(n) C F_capz(n) = ZERO_8 * * TRAJECTORY * ---------- prdm_8 = dble(F_ym(n)) jj = ( prdm_8 - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 * jj = max(Adw_haloy,jj) jj = min(jj,G_nj+Adw_haloy) * prdtm_8 = prdm_8 - Adw_bsy_8(jj) if ( prdtm_8 .lt. 0.0 ) then jj = max(Adw_haloy,jj - 1) C prdtm_8 = prdm_8 - Adw_bsy_8(jj) endif * * ADJ * --- F_y(n) = F_capy(n) * Adw_diy_8(jj) + F_y(n) C F_capy(n)= ZERO_8 * * TRAJECTORY * ---------- prdm_8 = dble(F_xm(n)) ii = ( prdm_8 - Adw_x00_8 ) * Adw_ovdx_8 ii = Adw_lcx( ii+1 ) + 1 * ii = max(2,ii) ii = min(ii,G_ni+2*Adw_halox-2) * prdtm_8 = prdm_8 - Adw_bsx_8(ii) if ( prdtm_8 .lt. 0.0 ) then ii = max(2,ii - 1) C prdtm_8 = prdm_8 - Adw_bsx_8(ii) endif * * ADJ * --- F_x(n) = F_capx(n) * Adw_dix_8(ii) + F_x(n) C F_capx(n)= ZERO_8 * enddo enddo enddo !$omp enddo * * Zero adjoint variables * (Put after because f90 compilation) * ----------------------------------- !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i F_capz(n)= ZERO_8 F_capy(n)= ZERO_8 F_capx(n)= ZERO_8 enddo enddo enddo !$omp enddo else !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * TRAJECTORY * ---------- prdm_8 = dble(F_zm(n)) kk = ( prdm_8 - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) prdm_8 = prdm_8 - Adw_bsz_8(kk) if ( prdm_8 .lt. 0.0 ) kk = kk - 1 C F_capzm(n) = prdm_8 * Adw_diz_8(kk) C if ( prdm_8 .lt. 0.0 ) F_capzm(n) = 1.0 + F_capzm(n) F_capzm1 = prdm_8 * Adw_diz_8(kk) if ( prdm_8 .lt. 0.0 ) F_capzm1 = 1.0 + F_capzm1 * * ADJ * --- F_n(n) = ZERO_8 * F_capz(n) = F_cz(n)*F_capzm1 * Adw_dbz_8(kk) + F_capz(n) F_capz(n) = (F_capzm1-1.0)*F_cz(n) * Adw_dbz_8(kk) + F_capz(n) C F_cz (n) = ZERO_8 C F_ydd(n) = ZERO_8 C F_ygg(n) = ZERO_8 C F_xdd(n) = ZERO_8 C F_xgg(n) = ZERO_8 * F_z(n) = F_capz(n) * Adw_diz_8(kk) + F_z(n) C F_capz(n) = ZERO_8 * * TRAJECTORY * ---------- prdm_8 = dble(F_ym(n)) jj = ( prdm_8 - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 * jj = max(Adw_haloy,jj) jj = min(jj,G_nj+Adw_haloy) * prdtm_8 = prdm_8 - Adw_bsy_8(jj) if ( prdtm_8 .lt. 0.0 ) then jj = max(Adw_haloy,jj - 1) C prdtm_8 = prdm_8 - Adw_bsy_8(jj) endif * * ADJ * --- F_y(n) = F_capy(n) * Adw_diy_8(jj) + F_y(n) C F_capy(n) = ZERO_8 * * TRAJECTORY * ---------- prdm_8 = dble(F_xm(n)) ii = ( prdm_8 - Adw_x00_8 ) * Adw_ovdx_8 ii = Adw_lcx( ii+1 ) + 1 * ii = max(2,ii) ii = min(ii,G_ni+2*Adw_halox-2) * prdtm_8 = prdm_8 - Adw_bsx_8(ii) if ( prdtm_8 .lt. 0.0 ) then ii = max(2,ii - 1) C prdtm_8 = prdm_8 - Adw_bsx_8(ii) endif * * ADJ * --- F_x(n) = F_capx(n) * Adw_dix_8(ii) + F_x(n) C F_capx(n) = ZERO_8 * enddo enddo enddo !$omp enddo * * Zero adjoint variables * (Put after because f90 compilation) * ----------------------------------- !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i F_capz(n)= ZERO_8 F_capy(n)= ZERO_8 F_capx(n)= ZERO_8 * F_cz (n)= ZERO_8 F_ydd (n)= ZERO_8 F_ygg (n)= ZERO_8 F_xdd (n)= ZERO_8 F_xgg (n)= ZERO_8 enddo enddo enddo !$omp enddo endif ************************************************************************ elseif (F_h_L) then ************************************************************************ if ( F_lin_L ) then !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * TRAJECTORY * ---------- prdm_8 = dble(F_ym(n)) jj = ( prdm_8 - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 * jj = max(Adw_haloy,jj) jj = min(jj,G_nj+Adw_haloy) * prdtm_8 = prdm_8 - Adw_bsy_8(jj) if ( prdtm_8 .lt. 0.0 ) then jj = max(Adw_haloy,jj - 1) C prdtm_8 = prdm_8 - Adw_bsy_8(jj) endif * * ADJ * --- F_n(n) = ZERO_8 F_y(n) = F_capy(n) * Adw_diy_8(jj) + F_y(n) C F_capy(n)= ZERO_8 * * TRAJECTORY * ---------- C kk = ( F_nm(n) - (mod ( F_nm(n), nijag ))) / nijag prdm_8 = dble(F_xm(n)) ii = ( prdm_8 - Adw_x00_8 ) * Adw_ovdx_8 ii = Adw_lcx( ii+1 ) + 1 * ii = max(2,ii) ii = min(ii,G_ni+2*Adw_halox-2) * prdtm_8 = prdm_8 - Adw_bsx_8(ii) if ( prdtm_8 .lt. 0.0 ) then ii = max(2,ii - 1) C prdtm_8 = prdm_8 - Adw_bsx_8(ii) endif * * ADJ * --- F_x(n) = F_capx(n) * Adw_dix_8(ii) + F_x(n) C F_capx(n)= ZERO_8 * enddo enddo enddo !$omp enddo * * Zero adjoint variables * (Put after because f90 compilation) * ----------------------------------- !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i F_capy(n)= ZERO_8 F_capx(n)= ZERO_8 enddo enddo enddo !$omp enddo else !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * TRAJECTORY * ---------- prdm_8 = dble(F_ym(n)) jj = ( prdm_8 - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 * jj = max(Adw_haloy,jj) jj = min(jj,G_nj+Adw_haloy) * prdtm_8 = prdm_8 - Adw_bsy_8(jj) if ( prdtm_8 .lt. 0.0 ) then jj = max(Adw_haloy,jj - 1) C prdtm_8 = prdm_8 - Adw_bsy_8(jj) endif * * ADJ * --- C F_n(n) = ZERO_8 C F_ydd(n) = ZERO_8 C F_ygg(n) = ZERO_8 C F_xdd(n) = ZERO_8 C F_xgg(n) = ZERO_8 * F_y(n) = F_capy(n) * Adw_diy_8(jj) + F_y(n) C F_capy(n) = ZERO_8 * * TRAJECTORY * ---------- C kk = ( F_nm(n) - (mod ( F_nm(n), nijag ))) / nijag prdm_8 = dble(F_xm(n)) ii = ( prdm_8 - Adw_x00_8 ) * Adw_ovdx_8 ii = Adw_lcx( ii+1 ) + 1 * ii = max(2,ii) ii = min(ii,G_ni+2*Adw_halox-2) * prdtm_8 = prdm_8 - Adw_bsx_8(ii) if ( prdtm_8 .lt. 0.0 ) then ii = max(2,ii - 1) C prdtm_8 = prdm_8 - Adw_bsx_8(ii) endif * * ADJ * --- F_x(n) = F_capx(n) * Adw_dix_8(ii) + F_x(n) C F_capx(n) = ZERO_8 * enddo enddo enddo !$omp enddo * * Zero adjoint variables * (Put after because f90 compilation) * ----------------------------------- !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i F_capy(n)= ZERO_8 F_capx(n)= ZERO_8 F_n (n)= ZERO_8 F_ydd (n)= ZERO_8 F_ygg (n)= ZERO_8 F_xdd (n)= ZERO_8 F_xgg (n)= ZERO_8 enddo enddo enddo !$omp enddo endif ************************************************************************ elseif (F_z_L) then ************************************************************************ if ( F_lin_L ) then !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * TRAJECTORY * ---------- C ij = mod ( F_nm(n), nijag ) prdm_8 = dble(F_zm(n)) kk = ( prdm_8 - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) prdm_8 = prdm_8 - Adw_bsz_8(kk) if ( prdm_8 .lt. 0.0 ) kk = kk - 1 * * ADJ * --- F_n(n) = ZERO_8 F_z(n) = F_capz(n) * Adw_diz_8(kk) + F_z(n) C F_capz(n) = ZERO_8 * enddo enddo enddo !$omp enddo * * Zero adjoint variables * (Put after because f90 compilation) * ----------------------------------- !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i F_capz(n)= ZERO_8 enddo enddo enddo !$omp enddo else !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * TRAJECTORY * ---------- C ij = mod ( F_nm(n), nijag ) prdm_8 = dble(F_zm(n)) kk = ( prdm_8 - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) prdm_8 = prdm_8 - Adw_bsz_8(kk) if ( prdm_8 .lt. 0.0 ) kk = kk - 1 C F_capzm(n) = prdm_8 * Adw_diz_8(kk) C if ( prdm_8 .lt. 0.0 ) F_capzm(n) = 1.0 + F_capzm(n) F_capzm1 = prdm_8 * Adw_diz_8(kk) if ( prdm_8 .lt. 0.0 ) F_capzm1 = 1.0 + F_capzm1 * * ADJ * --- F_n(n) = ZERO_8 * F_capz(n) = F_cz(n)*F_capzm1 * Adw_dbz_8(kk) + F_capz(n) F_capz(n) = (F_capzm1-1.0)*F_cz(n) * Adw_dbz_8(kk) + F_capz(n) C F_cz (n) = ZERO_8 * * ADJ * --- F_z(n) = F_capz(n) * Adw_diz_8(kk) + F_z(n) C F_capz(n) = ZERO_8 * enddo enddo enddo !$omp enddo * * Zero adjoint variables * (Put after because f90 compilation) * ----------------------------------- !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i F_capz(n)= ZERO_8 F_cz (n)= ZERO_8 enddo enddo enddo !$omp enddo endif ************************************************************************ endif !$omp end parallel ************************************************************************ * return end