!-------------------------------------- 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 - calddqr - horizontal divergence and horizontal relative
*                  vorticity from pi* vertical coordinates to pressure
*
#include "model_macros_f.h"
*

      subroutine calddqr( F_diver, F_relv, F_wlnph, F_ui , F_vi, F_dpdx, 1,2
     $                    F_dpdy , F_dudp, F_dvdp, F_wrk, DIST_DIM, Nk)

      implicit none
*
      integer DIST_DIM, Nk
      real F_diver(DIST_SHAPE, Nk), F_relv(DIST_SHAPE, Nk)
      real F_wlnph (DIST_SHAPE, Nk), F_wrk (DIST_SHAPE, Nk)
      real F_ui   (DIST_SHAPE, Nk), F_vi  (DIST_SHAPE, Nk)
      real F_dpdx (DIST_SHAPE, Nk), F_dpdy(DIST_SHAPE, Nk)
      real F_dudp (DIST_SHAPE, Nk), F_dvdp(DIST_SHAPE, Nk)
*
*author
*     Andre Methot - cmc - nov 95 - v0_16
*
*revision
* v2_00 - Lee/Desgagne      - initial MPI version (from calddqr v1_03)
* v3_00 - Desgagne & Lee    - Lam configuration
* v3_21 - Lee V.            - Output Optimization
* v3_30 - Lee V.            - LAM output correction
*
*object
*   calculate DD and QQ from DS and QS
***********************************************************************
*
* Given pi* coordinate horizontal divergence   
*   and pi* coordinate horizontal vorticity 
*
* the pressure coordinate horizontal divergence and 
*     pressure coordinate horizontal vorticity are obtained
*     with the following:
*
*                        dU   dP     dV   dP
*  DIV |   = DIV |    +  __ . __  +  __ . __
*      |         |       dP   dX     dP   dY
*       P        pi*
*
*                        dV   dP     dU   dP
*  VOR |   = VOR |    +  __ . __  -  __ . __
*      |         |       dP   dX     dP   dY
*       P        pi*
*                         where P is pressure or log of pressure.
*
**********************************************************************
*	
*
*arguments
*  Name        I/O                 Description
*----------------------------------------------------------------
* F_diver      I/O   - divergence
* F_relv       I/O   - relative vorticity
* F_wlnph      I      - log of hydrostatique pressure
* F_ui         I     - image wind u-component
* F_vi         I     - image wind v-component
* F_dpdx             - work field
* F_dpdy             - work field
* F_dudp             - work field
* F_dvdp             - work field
* F_wrk              - work field
*
*implicits
#include "glb_ld.cdk"
#include "geomg.cdk"
#include "intuv.cdk"
#include "inuvl.cdk"
*
**
      integer i, j, k, i0, in, j0, jn,i00
      real*8 fact1
      real*8 inv_geomg_cyv_8(l_miny:l_maxy)
*
*     ---------------------------------------------------------------
*
*     Compute dP/dX and dU/dP and put on phi grid
*     -------------------------------------------
      call rpn_comm_xch_halo (F_wlnph,LDIST_DIM,l_ni,l_nj,G_nk,
     $             G_halox,G_haloy,G_periodx,G_periody,l_ni,0)

*     F_dpdx and F_dudp are on U grid

      i0 = 1
      in = l_niu
      j0 = 1
      jn = l_nj
      call verder(F_dvdp , F_ui, F_wlnph, 2.0,  2.0, LDIST_DIM,
     $                                          G_nk,i0,in,j0,jn)
      do j=1-G_haloy,l_nj+G_haloy
         inv_geomg_cyv_8(j) = 1.0/geomg_cyv_8(j)
      enddo
*
!$omp parallel private (fact1,i00)
!$omp&         shared  (inv_geomg_cyv_8)
!$omp do
      do k=1,l_nk
         do j=j0,jn
         fact1 = 1. / geomg_cy_8(j)
         do i=i0,in
            F_dpdy(i,j,k)= ( F_wlnph(i+1,j,k) - F_wlnph(i,j,k) ) 
     %                     / geomg_hx_8(i)*fact1
            F_dvdp(i,j,k)= F_dvdp(i,j,k)*fact1
         end do
         end do
      end do
!$omp enddo
*
*     interpolate results to phi grid
*
!$omp single
      call rpn_comm_xch_halo (F_dpdy,LDIST_DIM,l_ni,l_nj,G_nk,
     $            G_halox,G_haloy,G_periodx,G_periody,l_ni,0)
      call rpn_comm_xch_halo (F_dvdp,LDIST_DIM,l_ni,l_nj,G_nk,
     $            G_halox,G_haloy,G_periodx,G_periody,l_ni,0)
!$omp end single
      i00=i0
      if ((G_lam).and.(l_west)) i00 = 2
*
!$omp do
      do k=1,l_nk
         do j = j0, jn
         do i = i00, in
            F_dpdx(i,j,k)= (1.0-intuv_c0xux_8(i-1)) * F_dpdy(i-1,j,k) +
     $                          intuv_c0xux_8(i-1)  * F_dpdy(i  ,j,k)
            F_dudp(i,j,k)= (1.0-intuv_c0xux_8(i-1)) * F_dvdp(i-1,j,k) +
     $                          intuv_c0xux_8(i-1)  * F_dvdp(i  ,j,k)
         end do
         end do
      end do
!$omp enddo
!$omp end parallel
*
*      Compute dP/dY and dV/dP and put on phi grid 
*      -------------------------------------------
*
      i0 = 1
      in = l_ni
      j0 = 1
      jn = l_njv
      if (l_south) j0 = 2
*
!$omp parallel shared  (inv_geomg_cyv_8)
!$omp do
      do k=1,l_nk
         do j = j0, jn
         do i = i0, in
            F_dpdy(i,j,k)= (1.0 - intuv_c0yvy_8(j-1)) * 
     $           (F_wlnph(i,j,k)-F_wlnph(i,j-1,k))*
     $           geomg_cyv2_8(j-1)*geomg_invhsy_8(j-1) * inv_geomg_cyv_8(j-1) +
     $                          intuv_c0yvy_8(j-1)  * 
     $           (F_wlnph(i,j+1,k)-F_wlnph(i,j,k))*
     $           geomg_cyv2_8(j)*geomg_invhsy_8(j) * inv_geomg_cyv_8(j)
         end do
         end do
         if (.not.G_lam) then
            if (l_south) then
            do i = i0, in
               F_dpdy(i,1,k) = intuv_c0yvy_8(0)
     $                   *(F_wlnph(i,2,k)-F_wlnph(i,1,k))*
     $                   geomg_cyv2_8(1)*geomg_invhsy_8(1)* inv_geomg_cyv_8(1)
            end do
            endif
            if (l_north) then
            do i = i0, in
               F_dpdy(i,l_nj,k)=(1.-intuv_c0yvy_8(l_nj-1))*
     $                 (F_wlnph(i,l_nj,k)-F_wlnph(i,l_nj-1,k))*
     $      geomg_cyv2_8(l_nj-1)*geomg_invhsy_8(l_nj-1)*inv_geomg_cyv_8(l_nj-1)
            end do
            endif
         endif
      end do
!$omp enddo
*
!$omp single
      call verder(F_wrk ,F_vi, F_wlnph, 2.0,  2.0, LDIST_DIM,G_nk,
     $                                                  i0,in,1,jn)
*
      call rpn_comm_xch_halo (F_wrk,LDIST_DIM,l_ni,l_nj,G_nk,
     $            G_halox,G_haloy,G_periodx,G_periody,l_ni,0)
!$omp end single
*
!$omp do
      do k=1,l_nk
         do j = j0, jn
         do i = i0, in
            F_dvdp(i,j,k)= 
     $      (1.0-intuv_c0yvy_8(j-1)) * F_wrk(i,j-1,k)*inv_geomg_cyv_8(j-1)+
     $           intuv_c0yvy_8(j-1)  * F_wrk(i,j  ,k)*inv_geomg_cyv_8(j)
         end do
         end do
         if (.not.G_lam) then
            if (l_south) then
            do i = i0, in
               F_dvdp(i,1,k) = intuv_c0yvy_8(0) *
     $                         F_wrk(i,1,k)* inv_geomg_cyv_8(1)
            end do
            endif
            if (l_north) then
            do i = i0, in
               F_dvdp(i,l_nj,k)=(1.-intuv_c0yvy_8(l_nj-1)) *
     $                          F_wrk(i,l_nj-1,k) * inv_geomg_cyv_8(l_nj-1)
            end do
            endif
         endif
      end do
!$omp enddo
!$omp end parallel
*
*      Combine terms
*      ----------------------------------------------
*
      i0 = 1
      in = l_ni
      j0 = 1
      jn = l_nj
      if (G_lam) then
          if (l_west) i0 = 2
          if (l_south)j0 = 2
          jn = l_njv
          in = l_niu
      endif
*
!$omp parallel  shared (inv_geomg_cyv_8)
!$omp do
      do k=1,l_nk
      do j= j0, jn
      do i= i0, in
         F_diver(i,j,k)= F_diver(i,j,k)+(F_dudp (i,j,k)*F_dpdx(i,j,k) +
     %                                   F_dvdp (i,j,k)*F_dpdy(i,j,k) )
         F_relv (i,j,k)= F_relv (i,j,k)+(F_dvdp (i,j,k)*F_dpdx(i,j,k) -
     %                                   F_dudp (i,j,k)*F_dpdy(i,j,k) )
      end do
      end do
      end do
!$omp enddo
      if (G_lam) then
          if (l_west) then
!$omp do
            do k=1,G_nk
             do j=j0,l_njv
                F_diver(1,j,k)=F_diver(2,j,k)
                F_relv(1,j,k)=F_relv(2,j,k)
             enddo
            enddo
!$omp enddo
          endif
          if (l_east) then
!$omp do
            do k=1,G_nk
             do j=j0,l_njv
                F_diver(l_ni,j,k)=F_diver(l_niu,j,k)
                F_relv(l_ni,j,k)=F_relv(l_niu,j,k)
             enddo
            enddo
!$omp enddo
          endif
          if (l_south) then
!$omp do
            do k=1,G_nk
             do i=1,l_ni
                F_diver(i,1,k)=F_diver(i,2,k)
                F_relv(i,1,k)=F_relv(i,2,k)
             enddo
            enddo
!$omp enddo
          endif
          if (l_north) then
!$omp do
            do k=1,G_nk
             do i=1,l_ni
                F_diver(i,l_nj,k)=F_diver(i,l_njv,k)
                F_relv(i,l_nj,k)=F_relv(i,l_njv,k)
             enddo
            enddo
!$omp enddo
          endif
      endif
!$omp end parallel

*
*     ---------------------------------------------------------------
*
      return
      end