⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cd_core.f90

📁 CCSM Research Tools: Community Atmosphere Model (CAM)
💻 F90
📖 第 1 页 / 共 3 页
字号:
              yzt(i,j,k) = pt(i,j,k)            enddo          enddo        enddo        call redistributestart(inter_ijk, .true., yzt)        call redistributefinish(inter_ijk, .true., ptxy)        call geopk(ptop, pexy, delpxy, pkxy, wzxy, hsxy, ptxy, 0, im, jm, km,    &                   jfirstxy, jlastxy, ifirstxy, ilastxy,                    &                   cp, akap, nx, ipe)!! Transpose back to yz decomposition!        call redistributestart(inter_ijkp, .false., pkxy)        call redistributefinish(inter_ijkp, .false., pkkp)        call redistributestart(inter_ijkp, .false., wzxy)        call redistributefinish(inter_ijkp, .false., wzkp)!$omp parallel do private(i, j, k)        do k = kfirst, klastp        do j = jfirst, jlast        do i = 1, im          pkc(i,j,k) = pkkp(i,j,k)          wz(i,j,k) = wzkp(i,j,k)        enddo        enddo        enddo!! pexy is an output quantity from geopk if ipe=1! Save pexy and pkxy to avoid main transpose; pe not needed.!        if (npr_z .gt. 1) then!! Fill in klast+1!         incount = 0         outcount = 0         if (kfirst .gt. 1) then          call bufferpack3d(pkc, 1, im, jfirst-1, jlast+1, kfirst, klast+1,    &                            1, im, jfirst, jlast, kfirst, kfirst,              &                            buff_s)           incount = im * (jlast-jfirst+1)          call bufferpack3d(wz, 1, im, jfirst-1, jlast+1, kfirst, klast+1,     &                            1, im, jfirst, jlast, kfirst, kfirst,              &                            buff_s(incount+1))           incount = incount + im * (jlast-jfirst+1)         endif         if (klast .lt. km) then          outcount = 2 * im * (jlast - jfirst + 1)         endif         call mp_barrier()         call mp_send(iam-npr_y,iam+npr_y,incount,outcount,buff_s,buff_r)         call mp_barrier()         call mp_recv(iam+npr_y,outcount,buff_r)         if (klast .lt. km) then          call bufferunpack3d(pkc,1,im,jfirst-1,jlast+1,kfirst,klast+1,     &                              1, im, jfirst, jlast, klast+1, klast+1,       &                              buff_r )          outcount = im * (jlast - jfirst + 1)          call bufferunpack3d(wz,1,im,jfirst-1,jlast+1,kfirst,klast+1,      &                              1, im, jfirst, jlast, klast+1, klast+1,       &                              buff_r(outcount+1) )         endif        endif       ! npr_z .gt. 1       endif       ! geopkd16      else#endif        if (geopkd16) then!! Use 16-byte reals (for compatibility with 2-D decomposition)!          call geopk16(ptop, pe, delp, pkcc, wzc, hs, pt, ng_d, im, jm, km,          &                       jfirst, jlast, 1, im, cp, akap, 1, km)        else!! Use 8-byte reals (standard)!          call geopk(ptop, pe, delp, pkcc, wzc, hs, pt, ng_d, im, jm, km,            &                     jfirst, jlast, 1, im,                                     &                     cp, akap, nx, ipe)        endif!! Geopk does not need j ghost zones of pkc and wz!!$omp parallel do private(i, j, k)        do k = kfirst, klast+1          do j = jfirst, jlast            do i = 1, im              pkc(i,j,k) = pkcc(i,j,k)              wz(i,j,k) = wzc(i,j,k)            enddo          enddo        enddo#if defined( SPMD )      endif#endif!! Upon exit from geopk, the quantities pe, pkc and wz will have been!      updated at klast+1      call t_stopf('d_geop')#if defined( SPMD )! Exchange boundary regions on north and south for pkc and wz      call t_startf('d_mpi_1')      call mp_send2_ns(im, jm, jfirst, jlast, kfirst, klast+1, &                       1, pkc, wz)      call t_stopf('d_mpi_1')#endif   if ( ipe .ne. 1 ) then          !  not the last call!! Perform some work while sending data on the way!!$omp parallel do private(i, j, k)    do k=kfirst,klast         do j=jfirst,jlast            do i=1,im               delpf(i,j,k) = delp(i,j,k)             enddo          enddo          call pft2d( delpf(1,js2g0,k), sc(js2g0), dc(1,js2g0),  &                      im, jn2g0-js2g0+1, ifax, trigs )    enddo   else!$omp parallel do private(i, j, k)    do k=kfirst,klast+1        do j=jfirst,jlast           do i=1,im             pk(i,j,k) = pkc(i,j,k)           enddo         enddo    enddo   endif#if defined( SPMD )      call t_startf('d_mpi_2')      call mp_recv2_ns(im, jm, jfirst, jlast, kfirst, klast+1, &                       1, pkc, wz)      call t_stopf('d_mpi_2')#endif#if defined ( HIGH_P )      call t_startf('highp')      call highp2(pkc,  wz,  wz3,    wzz,   dpt,          &                  im,   jm,   km,  jfirst, jlast,         &                  kfirst, klast, klastp, nx )      call t_stopf('highp')#else!! Beware k+1 references directly below (AAM)!!$omp parallel do private(i, j, k)   do k=kfirst,klast      do j=js1g1,jn1g1                  ! dpt needed NS         do i=1,im                       ! wz, pkc ghosted NS            dpt(i,j,k)=(wz(i,j,k+1)+wz(i,j,k))*(pkc(i,j,k+1)-pkc(i,j,k))         enddo      enddo   enddo#endif#if defined( SPMD )      call t_startf('d_mpi_3')      if ( ipe .ne. 1 ) then          !  not the last call         call mp_send3d_ns(im, jm, jfirst, jlast, kfirst, klast, &                            ng_d, ng_d, delpf, 1 )      endif      call t_stopf('d_mpi_3')#endif !  GHOSTING:   wz (input) NS ; pkc (input) NS      call t_startf('d-4500')!$omp parallel do private(i, j, k, wk3, wk1)#if defined ( HIGH_P )   do 4500 k=kfirst,klast+1#else   do 4500 k=max(kfirst,2),klast+1#endif      do j=js2g1,jn2g0                             ! wk3 needed S#if defined ( HIGH_P )          do i=1,im             wk3(i,j) = wz3(i,j,k)           enddo#else            wk3(1,j) = (wz(1,j,k)+wz(im,j,k)) *       &                     (pkc(1,j,k)-pkc(im,j,k))          do i=2,im            wk3(i,j) = (wz(i,j,k)+wz(i-1,j,k)) *      &                        (pkc(i,j,k)-pkc(i-1,j,k))          enddo#endif      enddo      do j=js2g1,jn2g0                                        do i=1,im-1            wk1(i,j) = wk3(i,j) + wk3(i+1,j)                 enddo            wk1(im,j) = wk3(im,j) + wk3(1,j)      ! wk3 ghosted S      enddo      if ( jfirst == 1 ) then          do i=1,im            wk1(i, 1) = 0.          enddo      endif      if ( jlast == jm ) then          do i=1,im            wk1(i,jm) = 0.          enddo      endif      do j=js2g0,jlast                          ! wk1 ghosted S         do i=1,im            wz3(i,j,k) = wk1(i,j) + wk1(i,j-1)         enddo      enddo! N-S walls      do j=js2g0,jn1g1                     ! wk1 needed N#if defined ( HIGH_P )          do i=1,im                          ! wz, pkc ghosted NS             wk1(i,j) = wzz(i,j,k)          enddo#else          do i=1,im                         ! wz, pkc ghosted NS             wk1(i,j) = (wz(i,j,k)+wz(i,j-1,k))*(pkc(i,j,k)-pkc(i,j-1,k))          enddo#endif      enddo      do j=js2g0,jn1g1                    ! wk3 needed N            wk3(1,j) = wk1(1,j) + wk1(im,j)      ! wk1 ghosted N          do i=2,im            wk3(i,j) = wk1(i,j) + wk1(i-1,j)   ! wk1 ghosted N          enddo      enddo      do j=js2g0,jn2g0         do i=1,im            wz(i,j,k) = wk3(i,j) + wk3(i,j+1)  ! wk3 ghosted N         enddo      enddo!!!      call avgc( pkc(1,jfirst-1,k), pkc(1,jfirst,k), im, jm,  &!!!                 jfirst, jlast, wk1 )      do j=js1g1,jn1g1        wk1(1,j) = pkc(1,j,k) + pkc(im,j,k)        do i=2,im          wk1(i,j) = pkc(i,j,k) + pkc(i-1,j,k)        enddo      enddo      do j=js2g0,jn1g1        do i=1,im          pkc(i,j,k) = wk1(i,j) + wk1(i,j-1)        enddo      enddo4500  continue      call t_stopf('d-4500')#if ( !defined HIGH_P )      if (kfirst == 1) then        do j=js2g0,jlast          do i=1,im            wz3(i,j,1) = 0.            wz(i,j,1) = 0.          enddo        enddo        pk4 = 4.*ptop**akap        do j=js2g0,jn1g1          do i=1,im            pkc(i,j,1) = pk4          enddo        enddo      endif#endif!     GHOSTING:   dpt (loop 4000) NS ; pkc (loop 4500) N      call t_startf('d-6000')!! Beware k+1 references directly below (AAM)!!$omp parallel do private(i, j, k, ub, wk1, wk2, wk3)   do 6000 k=kfirst,klast!!!      call avgc(dpt(1,jfirst-1,k), wk2(1,jfirst), im, jm,          &!!!                jfirst, jlast, wk1)      do j=js1g1,jn1g1        wk1(1,j) = dpt(1,j,k) + dpt(im,j,k)        do i=2,im          wk1(i,j) = dpt(i,j,k) + dpt(i-1,j,k)        enddo      enddo       do j=js2g0,jn1g1        do i=1,im          wk2(i,j) = wk1(i,j) + wk1(i,j-1)        enddo      enddo      do j=js2g0,jn1g1         do i=1,im            ub(i,j) = pkc(i,j,k+1) - pkc(i,j,k)         enddo      enddo      do j=js2g0,jlast         do i=1,im-1            wk3(i,j) = uc(i,j,k)  +  dtdxe(j)/(ub(i,j) + ub(i+1,j))      &                       * (wk2(i,j)-wk2(i+1,j)+wz3(i,j,k+1)-wz3(i,j,k))         enddo          wk3(im,j) = uc(im,j,k)  +  dtdxe(j)/(ub(im,j) + ub(1,j))       &                      * (wk2(im,j)-wk2(1,j)+wz3(im,j,k+1)-wz3(im,j,k))      enddo      do j=js2g0,jn2g0                  ! Assumes wk2 ghosted on N         do i=1,im            wk1(i,j) = vc(i,j,k)  +  dtdy/(ub(i,j)+ub(i,j+1)) *          &                       (wk2(i,j)-wk2(i,j+1)+wz(i,j,k+1)-wz(i,j,k))         enddo      enddo#if ( !defined ALT_PFT )      call pft2d( wk3(1,js2g0), se(js2g0), de(1,js2g0), im,           &                  jlast-js2g0+1,  ifax, trigs )      call pft2d( wk1(1,js2g0), sc(js2g0), dc(1,js2g0), im,           &                  jn2g0-js2g0+1,  ifax, trigs )#endif      do j=js2g0,jlast         do i=1,im            u(i,j,k) = u(i,j,k) + wk3(i,j)         enddo      enddo      do j=js2g0,jn2g0         do i=1,im            v(i,j,k) = v(i,j,k) + wk1(i,j)         enddo      enddo#if defined ( ALT_PFT )      call pft2d( u(1,js2g0,k), se(js2g0), de(1,js2g0), im,    &                  jlast-js2g0+1,  ifax, trigs )      call pft2d( v(1,js2g0,k), sc(js2g0), dc(1,js2g0), im,    &                  jn2g0-js2g0+1,  ifax, trigs )#endif6000  continue      call t_stopf('d-6000')#if defined( SPMD )      call t_startf('d_mpi_4')      if ( ipe .ne. 1 ) then         call mp_recv3d_ns(im, jm, jfirst, jlast, kfirst, klast, &                           ng_d, ng_d, delpf, 1)      endif      call t_stopf('d_mpi_4')#endif      return!EOC end!-----------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -