/[lmdze]/trunk/Sources/phylmd/Mobidic/regr_pr_av.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/Mobidic/regr_pr_av.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 134 by guez, Wed Apr 29 15:47:56 2015 UTC revision 162 by guez, Fri Jul 24 16:54:30 2015 UTC
# Line 4  module regr_pr_av_m Line 4  module regr_pr_av_m
4    
5  contains  contains
6    
7    subroutine regr_pr_av(ncid, name, julien, v3)    subroutine regr_pr_av(ncid, name, julien, paprs, v3)
8    
9      ! "regr_pr_av" stands for "regrid pressure averaging".      ! "regr_pr_av" stands for "regrid pressure averaging".
10    
# Line 30  contains Line 30  contains
30      use nr_util, only: assert      use nr_util, only: assert
31      use numer_rec_95, only: regr1_step_av      use numer_rec_95, only: regr1_step_av
32      use press_coefoz_m, only: press_in_edg      use press_coefoz_m, only: press_in_edg
     use pressure_var, only: p3d  
33    
34      integer, intent(in):: ncid ! NetCDF ID of the file      integer, intent(in):: ncid ! NetCDF ID of the file
35      character(len=*), intent(in):: name ! of the NetCDF variable      character(len=*), intent(in):: name ! of the NetCDF variable
36      integer, intent(in):: julien ! jour julien, 1 <= julien <= 360      integer, intent(in):: julien ! jour julien, 1 <= julien <= 360
37    
38        real, intent(in):: paprs(:, :) ! (klon, llm + 1)
39        ! (pression pour chaque inter-couche, en Pa)
40    
41      real, intent(out):: v3(:, :) ! (klon, llm)      real, intent(out):: v3(:, :) ! (klon, llm)
42      ! regridded field on the partial "physics" grid      ! regridded field on the partial "physics" grid
43      ! "v3(i, k)" is at longitude "xlon(i)", latitude "xlat(i)", in      ! "v3(i, k)" is at longitude "xlon(i)", latitude "xlat(i)", in
# Line 45  contains Line 47  contains
47    
48      integer varid ! for NetCDF      integer varid ! for NetCDF
49    
50      real  v1(jjm + 1, size(press_in_edg) - 1)      real v1(jjm + 1, size(press_in_edg) - 1)
51      ! input field at day "julien"      ! input field at day "julien"
52      ! "v1(j, k)" is at latitude "rlatu(j)" and for      ! "v1(j, k)" is at latitude "rlatu(j)" and for
53      ! pressure interval "[press_in_edg(k), press_in_edg(k+1)]".      ! pressure interval "[press_in_edg(k), press_in_edg(k+1)]".
54    
55      real v2(iim + 1, jjm + 1, llm)      real v2(klon, size(press_in_edg) - 1)
56      ! regridded field on the "dynamics" grid      ! Field on the "physics" horizontal grid. "v2(i, k)" is at
57      ! ("v2(i, j, k)" is at longitude "rlonv(i)", latitude      ! longitude "xlon(i)", latitude "xlat(i)" and for pressure
58      ! "rlatu(j)" and for pressure interval "[p3d(i, j, k+1), p3d(i, j, k)]".)      ! interval "[press_in_edg(k), press_in_edg(k+1)]".)
59    
60      integer i, j, k      integer i, k
61    
62      !--------------------------------------------      !--------------------------------------------
63    
64      call assert(shape(v3) == (/klon, llm/), "regr_pr_av")      call assert(shape(v3) == (/klon, llm/), "regr_pr_av klon llm")
65        call assert(shape(paprs) == (/klon, llm+1/), "regr_pr_av paprs")
66    
67      call nf95_inq_varid(ncid, name, varid)      call nf95_inq_varid(ncid, name, varid)
68    
# Line 69  contains Line 72  contains
72      ! "rlatu" is in descending order so we need to invert order:      ! "rlatu" is in descending order so we need to invert order:
73      v1 = v1(jjm+1:1:-1, :)      v1 = v1(jjm+1:1:-1, :)
74    
75        forall (k = 1:size(press_in_edg) - 1) v2(:, k) = pack(spread(v1(:, k), &
76             dim = 1, ncopies = iim + 1), dyn_phy)
77    
78      ! Regrid in pressure at each horizontal position:      ! Regrid in pressure at each horizontal position:
79      do j = 1, jjm + 1      do i = 1, klon
80         do i = 1, iim         v3(i, llm:1:-1) = regr1_step_av(v2(i, :), press_in_edg, &
81            if (dyn_phy(i, j)) then              paprs(i, llm+1:1:-1))
82               v2(i, j, llm:1:-1) &         ! (invert order of indices because "paprs" is in descending order)
                   = regr1_step_av(v1(j, :), press_in_edg, &  
                   p3d(i, j, llm+1:1:-1))  
              ! (invert order of indices because "p3d" is in descending order)  
           end if  
        end do  
83      end do      end do
84    
     forall (k = 1:llm) v3(:, k) = pack(v2(:, :, k), dyn_phy)  
   
85    end subroutine regr_pr_av    end subroutine regr_pr_av
86    
87  end module regr_pr_av_m  end module regr_pr_av_m

Legend:
Removed from v.134  
changed lines
  Added in v.162

  ViewVC Help
Powered by ViewVC 1.1.21