Ignore:
Timestamp:
Aug 22, 2013, 4:02:07 PM (11 years ago)
Author:
emillour
Message:

Common dynamics: (and collateral adaptations in Venus physics)
Improved cpdet routines in and additional sponge mode:

  • Additionnal sponge mode (trigered with "callsponge" flag), in line with the one used in the Generic and Martian GCM. This sponge is called whenever there is a dissipation step.
  • Improvement of the cpdet routines : created routines tpot2t_glo_p and t2tpot_glo_p which handle fields on the whole dynamics (scaler) grid, which are more efficient than calling tpot2t_p or t2tpot_p with slabs of data (generated use of intermediate copies of these chunks of data at every call)
  • Turned cpdet.F into a module cpdet_mod.F90 (and correspondingly adapted all routines in the Venus physics).

EM

File:
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.COMMON/libf/dyn3dpar/cpdet_mod.F90

    r1016 r1017  
    1 ! ADAPTATION GCM POUR CP(T)
    2 c======================================================================
    3 c S. Lebonnois, 10/2010
    4 c
    5 c Cp doit être calculé par cpdet(t) pour être valable partout
    6 c
    7 c La fonction d'Exner reste pk = RCPD*(play/pref)**RKAPPA
    8 c (RCPD=cpp, RKAPPA=kappa)
    9 c
    10 c On passe de T a teta (temperature potentielle) par t2tpot(t,teta,pk)
    11 c On passe de teta a T par tpot2t(teta,t,pk)
    12 c
    13 c======================================================================
     1module cpdet_mod
     2
     3implicit none
     4
     5! ADAPTATION OF GCM TO CP(T)
     6!======================================================================
     7! S. Lebonnois, 10/2010
     8!
     9! Cp must be computed using cpdet(t) to be valid
     10!
     11! The Exner function is still pk = RCPD*(play/pref)**RKAPPA
     12! (RCPD=cpp, RKAPPA=kappa)
     13!
     14! One goes from T to teta (potential temperature) using t2tpot(t,teta,pk)
     15! One goes from teta to T using tpot2t(teta,t,pk)
     16!
     17!======================================================================
     18
     19contains
    1420
    1521      SUBROUTINE ini_cpdet
     
    1723      USE control_mod, ONLY: planet_type
    1824      IMPLICIT none
    19 c======================================================================
    20 c Initialisation de nu_venus et t0_venus
    21 c======================================================================
     25!======================================================================
     26! Initialization of nu_venus and t0_venus
     27!======================================================================
    2228
    2329! for cpp, nu_venus and t0_venus:
     
    3339
    3440      return
    35       end
    36 
    37 c======================================================================
    38 c======================================================================
     41      end subroutine ini_cpdet
     42
     43!======================================================================
     44!======================================================================
    3945
    4046      FUNCTION cpdet(t)
     
    4652#include "comconst.h"
    4753
    48       real cpdet,t
     54      real,intent(in) :: t
     55      real cpdet
    4956
    5057      if (planet_type.eq."venus") then
     
    5562
    5663      return
    57       end
    58      
    59 c======================================================================
    60 c======================================================================
     64      end function cpdet
     65     
     66!======================================================================
     67!======================================================================
    6168
    6269      SUBROUTINE t2tpot(npoints, yt, yteta, ypk)
    63 c======================================================================
    64 c Arguments:
    65 c
    66 c yt   --------input-R- Temperature
    67 c yteta-------output-R- Temperature potentielle
    68 c ypk  --------input-R- Fonction d'Exner: RCPD*(pplay/pref)**RKAPPA
    69 c
    70 c======================================================================
     70!======================================================================
     71! Arguments:
     72!
     73! yt   --------input-R- Temperature
     74! yteta-------output-R- Temperature potentielle
     75! ypk  --------input-R- Fonction d'Exner: RCPD*(pplay/pref)**RKAPPA
     76!
     77!======================================================================
    7178
    7279      USE control_mod, ONLY: planet_type
     
    7683#include "comconst.h"
    7784
    78       integer npoints
    79       REAL    yt(npoints), yteta(npoints), ypk(npoints)
     85      integer,intent(in) :: npoints
     86      REAL,intent(in) :: yt(npoints), ypk(npoints)
     87      REAL,intent(out) :: yteta(npoints)
    8088     
    8189      if (planet_type.eq."venus") then
     
    8896
    8997      return
    90       end
    91 
    92 c======================================================================
    93 c======================================================================
     98      end subroutine t2tpot
     99
     100!======================================================================
     101!======================================================================
    94102
    95103      SUBROUTINE t2tpot_p(nlon,nlev, yt, yteta, ypk)
    96 ! Parallel version of t2tpot
    97       USE parallel
     104! Parallel version of t2tpot, for an arbitrary number of columns
    98105      USE control_mod, only : planet_type
    99106      IMPLICIT none
     
    110117     
    111118      if (planet_type.eq."venus") then
     119!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    112120        do l=1,nlev
    113121          yteta(:,l)=yt(:,l)**nu_venus                                  &
     
    116124          yteta(:,l)=yteta(:,l)**(1./nu_venus)
    117125        enddo
    118       else
     126!$OMP END DO
     127      else
     128!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    119129        do l=1,nlev
    120130          yteta(:,l)=yt(:,l)*cpp/ypk(:,l)
    121131        enddo
     132!$OMP END DO
    122133      endif ! of if (planet_type.eq."venus")
    123134
    124       END
    125 
    126 c======================================================================
     135      end subroutine t2tpot_p
     136
     137!======================================================================
     138!======================================================================
     139
     140      SUBROUTINE t2tpot_glo_p(yt, yteta, ypk)
     141! Parallel version of t2tpot, over the full dynamics (scalar) grid
     142! (more efficient than multiple calls to t2tpot_p() with slices of data)
     143      USE parallel, only : jj_begin,jj_end
     144      USE control_mod, only : planet_type
     145      IMPLICIT none
     146! for iip1, jjp1 and llm
     147#include "dimensions.h"
     148#include "paramet.h"
     149! for cpp, nu_venus and t0_venus:
     150#include "comconst.h"
     151
     152      real,intent(in) :: yt(iip1,jjp1,llm)
     153      real,intent(out) :: yteta(iip1,jjp1,llm)
     154      real,intent(in) :: ypk(iip1,jjp1,llm)
     155! local variable:
     156      integer :: j,l
     157      integer :: jjb,jje
     158     
     159      jjb=jj_begin
     160      jje=jj_end
     161
     162      if (planet_type.eq."venus") then
     163!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
     164        do l=1,llm
     165          yteta(:,jjb:jje,l)=yt(:,jjb:jje,l)**nu_venus                  &
     166     &                     -nu_venus*t0_venus**nu_venus*                &
     167     &                          log(ypk(:,jjb:jje,l)/cpp)
     168          yteta(:,jjb:jje,l)=yteta(:,jjb:jje,l)**(1./nu_venus)
     169        enddo
     170!$OMP END DO
     171      else
     172!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
     173        do l=1,llm
     174          yteta(:,jjb:jje,l)=yt(:,jjb:jje,l)*cpp/ypk(:,jjb:jje,l)
     175        enddo
     176!$OMP END DO
     177      endif ! of if (planet_type.eq."venus")
     178
     179      end subroutine t2tpot_glo_p
     180
     181!======================================================================
    127182
    128183      SUBROUTINE tpot2t(npoints,yteta, yt, ypk)
    129 c======================================================================
    130 c Arguments:
    131 c
    132 c yteta--------input-R- Temperature potentielle
    133 c yt   -------output-R- Temperature
    134 c ypk  --------input-R- Fonction d'Exner: RCPD*(pplay/pref)**RKAPPA
    135 c
    136 c======================================================================
     184!======================================================================
     185! Arguments:
     186!
     187! yteta--------input-R- Temperature potentielle
     188! yt   -------output-R- Temperature
     189! ypk  --------input-R- Fonction d'Exner: RCPD*(pplay/pref)**RKAPPA
     190!
     191!======================================================================
    137192
    138193      USE control_mod, ONLY: planet_type
     
    142197#include "comconst.h"
    143198
    144       integer npoints
    145       REAL    yt(npoints), yteta(npoints), ypk(npoints)
     199      integer,intent(in) :: npoints
     200      REAL,intent(in) :: yteta(npoints), ypk(npoints)
     201      REAL,intent(out) :: yt(npoints)
    146202     
    147203      if (planet_type.eq."venus") then
     
    154210 
    155211      return
    156       end
    157 
    158 c======================================================================
    159 c======================================================================
     212      end subroutine tpot2t
     213
     214!======================================================================
     215!======================================================================
     216
    160217      SUBROUTINE tpot2t_p(nlon,nlev,yteta,yt,ypk)
    161 ! Parallel version of tpot2t
    162       USE parallel
     218! Parallel version of tpot2t, for an arbitrary number of columns
    163219      USE control_mod, only : planet_type
    164220      IMPLICIT none
     
    175231
    176232      if (planet_type.eq."venus") then
     233!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    177234        do l=1,nlev
    178235          yt(:,l)=yteta(:,l)**nu_venus                                  &
     
    181238          yt(:,l)=yt(:,l)**(1./nu_venus)
    182239        enddo
    183       else
     240!$OMP END DO
     241      else
     242!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    184243        do l=1,nlev
    185244          yt(:,l)=yteta(:,l)*ypk(:,l)/cpp
    186245        enddo
     246!$OMP END DO
    187247      endif ! of if (planet_type.eq."venus")
    188       END
    189 
    190 c======================================================================
    191 c======================================================================
    192 c
    193 c ATTENTION
    194 c
    195 c Si un jour on a besoin, il faudra coder les routines
    196 c    dt2dtpot / dtpto2dt
    197 c
    198 c======================================================================
    199 c======================================================================
     248      end subroutine tpot2t_p
     249
     250!======================================================================
     251!======================================================================
     252
     253      SUBROUTINE tpot2t_glo_p(yteta,yt,ypk)
     254! Parallel version of tpot2t, over the full dynamics (scalar) grid
     255! (more efficient than multiple calls to tpot2t_p() with slices of data)
     256      USE parallel, only : jj_begin,jj_end
     257      USE control_mod, only : planet_type
     258      IMPLICIT none
     259! for iip1, jjp1 and llm
     260#include "dimensions.h"
     261#include "paramet.h"
     262! for cpp, nu_venus and t0_venus:
     263#include "comconst.h"
     264
     265      real,intent(out) :: yt(iip1,jjp1,llm)
     266      real,intent(in) :: yteta(iip1,jjp1,llm)
     267      real,intent(in) :: ypk(iip1,jjp1,llm)
     268! local variable:
     269      integer :: j,l
     270      integer :: jjb,jje
     271     
     272      jjb=jj_begin
     273      jje=jj_end
     274
     275      if (planet_type.eq."venus") then
     276!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
     277        do l=1,llm
     278          yt(:,jjb:jje,l)=yteta(:,jjb:jje,l)**nu_venus                  &
     279     &                  +nu_venus*t0_venus**nu_venus*                   &
     280     &                       log(ypk(:,jjb:jje,l)/cpp)
     281          yt(:,jjb:jje,l)=yt(:,jjb:jje,l)**(1./nu_venus)
     282        enddo
     283!$OMP END DO
     284      else
     285!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
     286        do l=1,llm
     287          yt(:,jjb:jje,l)=yteta(:,jjb:jje,l)*ypk(:,jjb:jje,l)/cpp
     288        enddo
     289!$OMP END DO
     290      endif ! of if (planet_type.eq."venus")
     291      end subroutine tpot2t_glo_p
     292
     293!======================================================================
     294!======================================================================
     295!
     296! ATTENTION
     297!
     298! Si un jour on a besoin, il faudra coder les routines
     299!    dt2dtpot / dtpto2dt
     300!
     301!======================================================================
     302!======================================================================
     303end module cpdet_mod
Note: See TracChangeset for help on using the changeset viewer.