!-------------------------------------- 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 uv2tdpsd - Computes total divergence & * vertical velocity diagnostically * #include "model_macros_f.h"*
subroutine uv2tdpsd (F_td, F_psd, F_uu, F_vv, F_ss, DIST_DIM, Nk) 6,3 * implicit none * integer DIST_DIM, Nk real F_td(DIST_SHAPE,Nk), F_psd(DIST_SHAPE,Nk), $ F_uu(DIST_SHAPE,Nk), F_vv (DIST_SHAPE,Nk), $ F_ss(DIST_SHAPE) * *authors * Methot et Patoine - sept 1995 - cmc * *revision * v2_00 - Desgagne M. - initial MPI version (from uv2tdpsd v1_03) * v2_30 - Edouard S. - adapt for vertical hybrid coordinate * v3_00 - Desgagne & Lee - Lam configuration * v3_03 - Desgagne M. - split call to rpn_comm_xch_halo for uv * v3_10 - Corbeil & Desgagne & Lee - AIXport+Opti+OpenMP * v3_21 - Desgagne M. - Optimization * v3_30 - Lee V. - Zero psd only if k=1,k=G_nk * *object ******************************************************************************* * * * The switch & = 0 (1) for a linear (non-linear) model. * * l * * * * d / dpi \ dpi * * -- | ln -- * | + D + --- * = 0 (1) * * dt \ dpi / dpi * * * * * * d / dpi \ __ / dpi \ d / . * dpi \ * * -- | -- * | + \/ . | V -- * | + -- | pi -- * | = 0 (2) * * dt \ dpi / \ dpi / dpi \ dpi / * * * * * * 1) Integrate (2) from pi to pi * * 1 gnk * * * * * * * pi * * / gnk * * | * * dpi | __ / dpi \ * * * -- | = - | \/ . | V -- * | dpi = 0 (3) * * dt | * | \ dpi / * * pi | * * gnk / * * * pi * * 1 * * * * dpi b dpi * * and, -- | = -- -- | since pi = b exp(s) (4) * * dt | * b dt | * * * pi gnk pi * * k gnk * * * * * * 2) Integrate (2) from pi to pi with (3) and (4) gives : * * k gnk * * * * * * * pi * * / 1 * * * / | \ * * . * dpi | | __ / dpi \ * b dpi | * * pi = -- | | \/ . | V -- * | dpi - -- -- | | * * dpi | | \ dpi / b dt | * | * * \ | gnk pi / * * / * gnk * * pi * * * * 3) From (1) , we get : * * * * . * * / \ * * dpi dpi | d / dpi \ __ dpi . * d / dpi \ | * * D + -- * = - -- | -- | -- | + V . \/ -- + pi -- | -- * | | * * dpi dpi | * \ dt / * * \ dpi / | * * \ dpi dpi dpi / * * * * with, * * d / dpi \ / __ 2 __ 2 __ __ * * -- | -- * | = | ( \/ A + \/ b exp(s) )( \/A + \/b ) - * * * \ dpi / \ __ __ __ 2 __ 2 \ * * dpi ( \/A + \/b exp(s))(\/ A + \/ b ) | / * * / * * __ __ 3 * * ( \/A + \/b ) * * * ******************************************************************************* * *arguments *______________________________________________________________________ * | | | | * NAME | DESCRIPTION | DIMENSION |I/O| *--------|---------------------------------------------|-----------|---| * F_td | total divergence | 3D | o | * F_psd | vertical velocity ( pi*-dot ) | 3D | o | *--------|---------------------------------------------|-----------|---| * F_uu | x component of velocity | 3D | i | * F_vv | y component of velocity | 3D | i | * F_ss | ln ( pi / z ) | 2D | i | *________|_____________________________________________|___________|___| * *implicits #include "glb_ld.cdk"
#include "geomg.cdk"
#include "intuv.cdk"
* *modules * integer i, j, k, ng real pr1, prsc real uv(DIST_SHAPE,Nk,2),dvi(DIST_SHAPE,Nk),w1(DIST_SHAPE,Nk) real*8 expf(l_niu+1,l_njv+1), expfm1(l_niu+1,l_njv+1), $ inv_geomg_hx_8(l_ni), gratio(l_nj), inv_geomg_cy2_8(l_nj) ** * ________________________________________________________________ * call rpn_comm_xch_halo( F_ss, LDIST_DIM, l_ni, l_nj , 1, % G_halox,G_haloy,G_periodx,G_periody,l_ni,0) * !$omp parallel * !$omp do do k = 1, Nk F_td (:,:,k ) = 0. uv (:,:,k,:) = 0. if (k.eq.1) then do j = 1,l_njv+1 do i = 1,l_niu+1 expf (i,j) = exp(F_ss(i,j)) expfm1(i,j) = expf(i,j) - 1.0d0 end do end do do i = 1, l_niu inv_geomg_hx_8(i) = 1.0d0 / geomg_hx_8(i) end do do j = 1, l_njv gratio(j) = geomg_cyv2_8(j) / geomg_hsy_8(j) inv_geomg_cy2_8(j) = 1.0d0 / geomg_cy2_8(j) end do inv_geomg_cy2_8(l_nj) = 1.0d0 / geomg_cy2_8(l_nj) endif end do !$omp enddo * __ * * compute \/ . ( V dpi/dpi ) * !$omp do do k=1,G_nk do j = 1, l_nj do i = 1, l_niu uv(i,j,k,1) = F_uu(i,j,k) * ( $ (1.-intuv_c0xxu_8(i))*(1.+(geomg_dpib(k)*expfm1(i,j))) $ + intuv_c0xxu_8(i) *(1.+(geomg_dpib(k)*expfm1(i+1,j))) ) end do end do do j = 1, l_njv do i = 1, l_ni uv(i,j,k,2) = F_vv(i,j,k) * ( $ (1.-intuv_c0yyv_8(j))*(1.+(geomg_dpib(k)*expfm1(i,j))) $ + intuv_c0yyv_8(j) *(1.+(geomg_dpib(k)*expfm1(i,j+1))) ) end do end do end do !$omp enddo * !$omp single call rpn_comm_xch_halo (uv, LDIST_DIM, l_niu,l_nj, $ G_nk,G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) call rpn_comm_xch_halo (uv(minx,miny,1,2), LDIST_DIM, l_ni,l_njv, $ G_nk,G_halox,G_haloy,G_periodx,G_periody,l_ni,0 ) !$omp end single * !$omp do do k=1,G_nk call caldiv_2
( F_td(minx,miny,k), uv(minx,miny,k,1), $ uv(minx,miny,k,2), LDIST_DIM, 1 ) end do !$omp enddo * * * * pi * / gnk * | __ * * * compute | \/ . ( V dpi/dpi ) dpi * | * / * * pi * k * ng = (l_maxx-l_minx+1)*(l_maxy-l_miny+1) call hatoprg
(dvi,F_td,1.0,geomg_hz_8,ng,G_nk) * * .* * compute pi * k * !$omp do do k=1,G_nk do j=1,l_nj do i=1,l_ni pr1 = 1.0 + geomg_dpib(k) * expfm1(i,j) F_psd(i,j,k) = (dvi(i,j,k) + ((geomg_pib(k)/ % geomg_pib(G_nk)) -1) * dvi(i,j,1))/pr1 end do end do do j = 1, l_nj do i = 1, l_niu uv(i,j,k,1) = (F_ss(i+1,j)-F_ss(i,j)) * $ inv_geomg_hx_8(i) * F_uu(i,j,k) end do end do do j = 1, l_njv do i = 1, l_ni uv(i,j,k,2) = (F_ss(i,j+1)-F_ss(i,j)) * $ gratio(j) * F_vv(i,j,k) end do end do end do !$omp enddo !$omp end parallel * call itf_phy_uvgridscal
( uv(minx,miny,1,1), uv(minx,miny,1,2), $ LDIST_DIM, l_nk, .true. ) * * Compute total divergence * ------------------------ prsc = 1./geomg_pib(G_nk) !$omp parallel private(pr1) !$omp do do k=1,G_nk do j= 1, l_nj do i= 1, l_ni pr1 = (uv(i,j,k,1)+uv(i,j,k,2))*inv_geomg_cy2_8(j) F_td(i,j,k) = $ geomg_dpib(k)*(prsc*dvi(i,j,1)-expf(i,j)*pr1) $ - F_psd(i,j,k)*expfm1(i,j)*geomg_dpia(k) F_td(i,j,k) = F_td(i,j,k)/(1+geomg_dpib(k)*expfm1(i,j)) enddo enddo * for openmp, the k must be checked to apply the zero if (k.eq.1.or.k.eq.G_nk) F_psd(:,:, k) = 0. enddo !$omp enddo * !$omp end parallel * * ________________________________________________________________ * return end