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

📄 dp_coupling.f90

📁 CCSM Research Tools: Community Atmosphere Model (CAM)
💻 F90
📖 第 1 页 / 共 3 页
字号:
          if (local_dp_map) then!$omp parallel do private(lchnk, i, k, ncol, m, lons, lats)             do lchnk = begchunk,endchunk                ncol = get_ncols_p(lchnk)                call get_lon_all_p(lchnk, ncol, lons)                call get_lat_all_p(lchnk, ncol, lats)                do k = 1, plev                   do i = 1, ncol                      dvdtxy(lons(i),k,lats(i)) = phys_tend(lchnk)%dvdt(i,k)                      dudtxy(lons(i),k,lats(i)) = phys_tend(lchnk)%dudt(i,k)                      ptxy  (lons(i),lats(i),k) = phys_state(lchnk)%t(i,k)                   enddo                enddo                do m=1,ppcnst                   do k=1,plev                      do i=1,ncol                         q3xy(lons(i),lats(i),k,m) = phys_state(lchnk)%q(i,k,m)                      end do                   end do                end do             enddo          else             tsize = 3 + ppcnst             blksiz = (endlatxy-beglatxy+1)*(endlonxy-beglonxy+1)             allocate(bpter(blksiz,0:plev))             allocate(bbuffer(tsize*block_buf_nrecs))             allocate(cbuffer(tsize*chunk_buf_nrecs))             do lchnk = begchunk,endchunk                ncol = get_ncols_p(lchnk)                call chunk_to_block_send_pters(lchnk,pcols,plev+1,tsize,cpter)                do i=1,ncol                   do k=1,plev                      cbuffer(cpter(i,k))   = phys_tend(lchnk)%dvdt(i,k)                      cbuffer(cpter(i,k)+1) = phys_tend(lchnk)%dudt(i,k)                      cbuffer(cpter(i,k)+2) = phys_state(lchnk)%t(i,k)                      do m=1,ppcnst                         cbuffer(cpter(i,k)+2+m) = phys_state(lchnk)%q(i,k,m)                      end do                   end do                  end do             end do             call transpose_chunk_to_block(tsize, cbuffer, bbuffer)             call chunk_to_block_recv_pters(iam+1,blksiz,plev+1,tsize,bpter)             ib = 0             do j=beglatxy,endlatxy                do i=beglonxy,endlonxy                   ib = ib + 1                   do k=1,plev                      dvdtxy(i,k,j) = bbuffer(bpter(ib,k))                      dudtxy(i,k,j) = bbuffer(bpter(ib,k)+1)                      ptxy  (i,j,k) = bbuffer(bpter(ib,k)+2)                      do m=1,ppcnst                         q3xy(i,j,k,m) = bbuffer(bpter(ib,k)+2+m)                      end do                   enddo                enddo             enddo             deallocate(bpter)             deallocate(bbuffer)             deallocate(cbuffer)          endif          if (.not. full_phys) then!$omp parallel do private(i, j, k)             do k=1,plev                do j=beglatxy,endlatxy                   do i=beglonxy,endlonxy                      ptxy(i,j,k) = ptxy(i,j,k) / pkzxy(i,j,k)                   enddo                enddo             enddo          endif       endif#if defined (SPMD)! Transpose from xy to yz decomposition       call t_startf('transpose_bck2')       if (.not. adiabatic) then          call redistributestart (inter_ikj, .false., dudtxy)          call redistributefinish(inter_ikj, .false., dudt)          call redistributestart (inter_ikj, .false., dvdtxy)          call redistributefinish(inter_ikj, .false., dvdt)       endif       call redistributestart (inter_ijk, .false., ptxy)       call redistributefinish(inter_ijk, .false., yzt)!! TEMPORARY:  copy YZT to PT!!$omp parallel do private(i,j,k)       do k=beglev,endlev          do j = beglat,endlat             do i=1,plon                pt(i,j,k) = yzt(i,j,k)             enddo          enddo       enddo       call redistributestart (inter_q3, .false., q3xy)       call redistributefinish(inter_q3, .false., q3t)!! TEMPORARY:  copy Q3 to Q3T, U3SXY to XYT!!$omp parallel do private(i,j,k,m)       do m=1,ppcnst          do k=beglev,endlev             do j = beglat,endlat                do i=1,plon                   q3(i,j,k,m) = q3t(i,j,k,m)                enddo             enddo          enddo       enddo!$omp parallel do private(i,j,k)       do k=1,plev          do j = beglatxy,endlatxy             do i=beglonxy,endlonxy                xyt(i,j,k) = u3sxy(i,j,k)             enddo          enddo       enddo       call redistributestart (inter_ijk, .false., xyt)   ! send U3SXY       call redistributefinish(inter_ijk, .false., yzt)   ! recv U3S!! TEMPORARY:  copy YZT to U3S!!$omp parallel do private(i,j,k)       do k=beglev,endlev          do j = beglat,endlat             do i=1,plon                u3s(i,j,k) = yzt(i,j,k)             enddo          enddo       enddo       call redistributestart (inter_ijk, .false., v3sxy)       call redistributefinish(inter_ijk, .false., yzt)  ! recv V3S!! TEMPORARY:  copy YZT to U3S!!$omp parallel do private(i,j,k)       do k=beglev,endlev          do j = beglat,endlat             do i=1,plon                v3s(i,j,k) = yzt(i,j,k)             enddo          enddo       enddo       call t_stopf('transpose_bck2')#endif    else! -------------------------------------------------------------------------! Copy onto yz decomposition! -------------------------------------------------------------------------       if (.not. adiabatic) then          if (local_dp_map) then!$omp parallel do private(lchnk, i, k, ncol, m, lons, lats)             do lchnk = begchunk,endchunk                ncol = get_ncols_p(lchnk)                call get_lon_all_p(lchnk, ncol, lons)                call get_lat_all_p(lchnk, ncol, lats)                do k = 1, plev                   do i = 1, ncol                      dvdt(lons(i),k,lats(i)) = phys_tend(lchnk)%dvdt(i,k)                      dudt(lons(i),k,lats(i)) = phys_tend(lchnk)%dudt(i,k)                      pt  (lons(i),lats(i),k) = phys_state(lchnk)%t(i,k)                   enddo                enddo                do m=1,ppcnst                   do k=1,plev                      do i=1,ncol                         q3(lons(i),lats(i),k,m) = phys_state(lchnk)%q(i,k,m)                      end do                   end do                end do             enddo          else             tsize = 3 + ppcnst             allocate(bpter(plon,0:plev))             allocate(bbuffer(tsize*block_buf_nrecs))             allocate(cbuffer(tsize*chunk_buf_nrecs))             do lchnk = begchunk,endchunk                ncol = get_ncols_p(lchnk)                call chunk_to_block_send_pters(lchnk,pcols,plev+1,tsize,cpter)                do i=1,ncol                   do k=1,plev                      cbuffer(cpter(i,k))   = phys_tend(lchnk)%dvdt(i,k)                      cbuffer(cpter(i,k)+1) = phys_tend(lchnk)%dudt(i,k)                      cbuffer(cpter(i,k)+2) = phys_state(lchnk)%t(i,k)                      do m=1,ppcnst                         cbuffer(cpter(i,k)+2+m) = phys_state(lchnk)%q(i,k,m)                      end do                   end do                end do             end do             call transpose_chunk_to_block(tsize, cbuffer, bbuffer)             do j=beglat,endlat                 call chunk_to_block_recv_pters(j,plon,plev+1,tsize,bpter)                do i=1,nlon(j)                   do k=1,plev                      dvdt(i,k,j) = bbuffer(bpter(i,k))                      dudt(i,k,j) = bbuffer(bpter(i,k)+1)                      pt  (i,j,k) = bbuffer(bpter(i,k)+2)                      do m=1,ppcnst                         q3(i,j,k,m) = bbuffer(bpter(i,k)+2+m)                      end do                   end do                end do             end do             deallocate(bpter)             deallocate(bbuffer)             deallocate(cbuffer)          endif          if (.not. full_phys) then!$omp parallel do private(i, j, k)             do k=1,plev                do j=beglat,endlat                   do i=1,plon                      pt(i,j,k) = pt(i,j,k) / pkz(i,j,k)                   enddo                enddo             enddo          endif       endif    endif    if (.not. adiabatic) then! -------------------------------------------------------------------------! Update u3s and v3s from tendencies dudt and dvdt.! -------------------------------------------------------------------------       dt5 = .5*dtime       call uv3s_update(dudt, u3s, dvdt, v3s, dt5,                     &                        plon, plat, plev, beglat, endlat,              &                        ng_d, ng_s, ng_s, ng_d, beglev, endlev)    endif! -------------------------------------------------------------------------! Compute pt, q3, pe, delp, ps, peln, pkz and pk.! For 2-D decomposition, delp is transposed to delpxy, pexy is computed!  from delpxy (and ptop), and pexy is transposed back to pe.! Note that pt, q3 and pe are input parameters as well.! The quantity qtmp was originally computed in stepon, just prior to!  d_p_coupling.! For ideal or adiabatic physics, fewer quantities are updated.! -------------------------------------------------------------------------    call p_d_adjust(pe,   pt,   q3,  qtmp,   delp,   ps,      &                    peln, pk,   pkz,  zvir,    cappa,  delpxy, &                    pexy, ptop, full_phys  ) !EOC  end subroutine p_d_coupling!-----------------------------------------------------------------------end module dp_coupling

⌨️ 快捷键说明

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