!-------------------------------------- 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 v4d_varconv_ad - ADJ of conversion control variables GEM <--> 3D-Var * #include "model_macros_f.h"*
subroutine v4d_varconv_ad( C_ut1, C_vt1, C_tt1, C_hut1, C_st1, 3,4 $ C_tt1m, C_hut1m, C_st1m, DIST_DIM, Nk, inverse_L ) * implicit none * integer DIST_DIM,Nk real C_ut1 (DIST_SHAPE,Nk), C_vt1 (DIST_SHAPE,Nk), % C_tt1 (DIST_SHAPE,Nk), C_hut1 (DIST_SHAPE,Nk), % C_st1 (DIST_SHAPE), % C_tt1m(DIST_SHAPE,Nk), C_hut1m(DIST_SHAPE,Nk), % C_st1m(DIST_SHAPE) logical inverse_L * *author * Stephane Laroche * *revision * v3_00 - Laroche S. - initial MPI version * v3_00 - Gauthier P. - ln q to q * v3_00 - Tanguay M. - verify zeroing of hut1m * v3_02 - Laroche S. - conversion to hybrid coordinate * v3_02 - Buehner M. - temporarilly set humidity to zero for SV job * v3_11 - Tanguay M. - Add option for profiles done on U-V grids for winds * - Add option for staggering already done by 3D-Var * v3_20 - Buehner & Zadra - add option for using HU as humidity variable * v3_30 - Fillion/Tanguay - Extend the scaling to all the grid in LAM mode * v3_31 - Tanguay M. - Add OPENMP directives * *object * *arguments * Name I/O Description *---------------------------------------------------------------- * C_ut1 * C_vt1 * C_tt1 * C_hut1 * C_st1 *---------------------------------------------------------------- * *implicits #include "glb_ld.cdk"
#include "geomg.cdk"
#include "cstv.cdk"
#include "dcst.cdk"
#include "v4dg.cdk"
* *modules * integer i, j, k real*8 pri2c_8 real wu(LDIST_SHAPE,l_nk),wv(LDIST_SHAPE,l_nk) if(.not.inverse_L) then C C Conversion GEM --> 4D-Var C ========================= C * * Humidity: Delta(log q) = Delta q / q(ref) * if (V4dg_chum_s.eq.'LQ') then !$omp parallel do do k=1,Nk do j= 1, l_nj do i= 1, l_ni if(C_hut1m(i,j,k).eq.0.0) then C_hut1(i,j,k) = 0.0 else C_hut1(i,j,k) = C_hut1(i,j,k)/C_hut1m(i,j,k) endif end do end do end do !$omp end parallel do endif C C Winds C ----- C if (.not.V4dg_pruv_L) then * !$omp parallel do do k=1,Nk do j= 1, l_nj pri2c_8 = (1.0/Geomg_cy_8(j))*Dcst_rayt_8 do i= 1, l_ni C_ut1(i,j,k) = C_ut1(i,j,k)*pri2c_8 C_vt1(i,j,k) = C_vt1(i,j,k)*pri2c_8 end do end do end do !$omp end parallel do call itf_phy_uvgridscal_ad
( C_ut1, C_vt1, LDIST_DIM, Nk, .true. ) * else * !$omp parallel do do k=1,Nk do j= 1, l_njv pri2c_8 = (1.0/Geomg_cyv_8(j))*Dcst_rayt_8 do i= 1, l_ni C_vt1(i,j,k) = C_vt1(i,j,k)*pri2c_8 end do end do end do !$omp end parallel do * !$omp parallel do do k=1,Nk do j= 1, l_nj pri2c_8 = (1.0/Geomg_cy_8(j))*Dcst_rayt_8 do i= 1, l_niu C_ut1(i,j,k) = C_ut1(i,j,k)*pri2c_8 end do end do end do !$omp end parallel do * endif C C Temperature C ----------- C !$omp parallel do do k=1,Nk do j= 1, l_nj do i= 1, l_ni C_hut1(i,j,k) = C_hut1(i,j,k) $ - (C_tt1(i,j,k)*Dcst_delta_8/(1.0 + Dcst_delta_8*C_hut1m(i,j,k))) $ *((C_tt1m(i,j,k) + Cstv_tstr_8)/(1.0 + Dcst_delta_8*C_hut1m(i,j,k))) C_tt1(i,j,k) = (C_tt1(i,j,k)/(C_tt1m(i,j,k) + Cstv_tstr_8)) $ *((C_tt1m(i,j,k) + Cstv_tstr_8)/(1.0 + Dcst_delta_8*C_hut1m(i,j,k))) end do end do end do !$omp end parallel do C C Surface pressure C ---------------- C !$omp parallel do do j= 1, l_nj do i= 1, l_ni C_st1(i,j) = Geomg_z_8(Nk) * exp(C_st1m(i,j)) * C_st1(i,j) end do end do !$omp end parallel do * else * C C Conversion 4D-Var --> GEM C ========================= C * C C Winds C ----- * * Zero adjoint variables * ---------------------- !$omp parallel do do k=1,Nk do j=l_miny,l_maxy do i=l_minx,l_maxx wu(i,j,k) = 0.0 wv(i,j,k) = 0.0 enddo enddo enddo !$omp end parallel do * if(V4dg_vstag_L) then !$omp parallel do do k=1,Nk do j= 1, l_njv pri2c_8 = (1.0/Geomg_cyv_8(j))*Dcst_rayt_8 do i= 1, l_ni C_vt1(i,j,k) = C_vt1(i,j,k)/pri2c_8 end do end do end do !$omp end parallel do endif * if(V4dg_ustag_L) then !$omp parallel do do k=1,Nk do j= 1, l_nj pri2c_8 = (1.0/Geomg_cy_8(j))*Dcst_rayt_8 do i= 1, l_niu C_ut1(i,j,k) = C_ut1(i,j,k)/pri2c_8 end do end do end do !$omp end parallel do endif * if(.not.V4dg_ustag_L.and..not.V4dg_vstag_L) then call itf_phy_uvgridscal_ad
( C_ut1, C_vt1, LDIST_DIM, Nk, .false. ) * elseif(V4dg_ustag_L.and..not.V4dg_vstag_L) then call itf_phy_uvgridscal_ad
( wu, C_vt1, LDIST_DIM, Nk, .false. ) * elseif(.not.V4dg_ustag_L.and.V4dg_vstag_L) then call itf_phy_uvgridscal_ad
( C_ut1, wv, LDIST_DIM, Nk, .false. ) endif * if(.not.V4dg_vstag_L) then !$omp parallel do do k=1,Nk do j= 1, l_nj pri2c_8 = (1.0/Geomg_cy_8(j))*Dcst_rayt_8 do i= 1, l_ni C_vt1(i,j,k) = C_vt1(i,j,k)/pri2c_8 end do end do end do !$omp end parallel do endif * if(.not.V4dg_ustag_L) then !$omp parallel do do k=1,Nk do j= 1, l_nj pri2c_8 = (1.0/Geomg_cy_8(j))*Dcst_rayt_8 do i= 1, l_ni C_ut1(i,j,k) = C_ut1(i,j,k)/pri2c_8 end do end do end do !$omp end parallel do endif * !$omp parallel do do k=1,Nk do j=l_miny,l_maxy do i=l_minx,l_maxx wu(i,j,k) = 0.0 wv(i,j,k) = 0.0 enddo enddo enddo !$omp end parallel do C C Temperature C ----------- C !$omp parallel do do k=1,Nk do j= 1, l_nj do i= 1, l_ni C_hut1(i,j,k) = C_hut1(i,j,k) + C_tt1(i,j,k)*Dcst_delta_8 $ *(C_tt1m(i,j,k) + Cstv_tstr_8)/(1.0 + Dcst_delta_8*C_hut1m(i,j,k)) C_tt1(i,j,k) = C_tt1(i,j,k)*(1.0 + Dcst_delta_8*C_hut1m(i,j,k)) end do end do end do !$omp end parallel do C C Surface pressure C ---------------- C !$omp parallel do do j= 1, l_nj do i= 1, l_ni C_st1(i,j) = C_st1(i,j)/(Geomg_z_8(Nk) * exp(C_st1m(i,j))) end do end do !$omp end parallel do C C Humidity: Delta q = q(ref) * Delta( log q) C if (V4dg_chum_s.eq.'LQ') then !$omp parallel do do k=1,Nk do j= 1, l_nj do i= 1, l_ni C_hut1(i,j,k) = C_hut1(i,j,k)*C_hut1m(i,j,k) end do end do end do !$omp end parallel do endif * endif * * TEMPORARY: Set humidity field to zero for SV job c if(V4dg_sgvc_L) C_hut1(:,:,:)=0.0 * return end