source: trunk/LMDZ.VENUS/libf/phyvenus/radlwsw_NewtonCool.F @ 3556

Last change on this file since 3556 was 2486, checked in by emillour, 4 years ago

Venus GCM:
Cleanup radlwsw_newtoncool (make it a module in the process) and modify it so that the temperature field towards wich the relmaxation will be done is built using "presnivs" (average model level pressure) and not the GCM's actual pressure field at the first step of the simulation.
With this change, one has 1+1=2 when runing with flag "physideal".
EM

File size: 4.1 KB
RevLine 
[3]1!
2! $Header: /home/cvsroot/LMDZ4/libf/phylmd/radlwsw.F,v 1.2 2004/10/27 10:14:46 lmdzadmin Exp $
3!
[2486]4      MODULE radlwsw_newtoncool_mod
[1301]5     
[2486]6      implicit none
7     
8      contains
9     
10      SUBROUTINE radlwsw_newtoncool(presnivs,pt)
11     
[3]12c======================================================================
13c   S. Lebonnois    12/04/2007
14c  VERSION NEWTONIAN COOLING pour Venus (no diurnal cycle)
[1301]15c  update 01/2014
[3]16c======================================================================
[2486]17      use dimphy, only: klon,klev
[1545]18      USE geometry_mod, ONLY: latitude ! in radians
[1310]19      USE phys_state_var_mod, only: heat,cool,radsol,
[2135]20     .  topsw,toplw,solsw,sollw,sollwdown,lwnet,swnet,zt_eq
[2486]21
[101]22      IMPLICIT none
[2486]23      include "YOMCST.h"
[1301]24
25c ARGUMENTS
26 
[2486]27      real,intent(in) :: presnivs(klev) ! approx. pressure of GCM levels (Pa)
28      real,intent(in) :: pt(klon,klev) ! atmospheric temperature (K)
[1301]29 
30c LOCAL VARIABLES
[3]31      INTEGER i,j,k
32      integer    nlevCLee,level
33      parameter (nlevCLee=30)
34      REAL   pressCLee(nlevCLee+1),tempCLee(nlevCLee+1)
35      real   dt_epCLee(nlevCLee+1),etaCLee(nlevCLee+1)
36      real   tauCLee
37      parameter (tauCLee=25*86400) ! en s
38      real   ztemp,zdt,fact
[2135]39      real   dTsdt(klev)
[3]40     
41      data     etaCLee/9.602e-1,8.679e-1,7.577e-1,6.420e-1,5.299e-1,
42     .                 4.273e-1,3.373e-1,2.610e-1,1.979e-1,1.472e-1,
43     .                 1.074e-1,7.672e-2,5.361e-2,3.657e-2,2.430e-2,
44     .                 1.569e-2,9.814e-3,5.929e-3,3.454e-3,1.934e-3,
45     .                 1.043e-3,5.400e-4,2.710e-4,1.324e-4,6.355e-5,
46     .                 3.070e-5,1.525e-5,7.950e-6,4.500e-6,2.925e-6,
47     .                 2.265e-6/
48      data   tempCLee/728.187,715.129,697.876,677.284,654.078,628.885,
49     .                602.225,574.542,546.104,517.339,488.560,459.932,
50     .                431.741,404.202,377.555,352.042,327.887,305.313,
51     .                284.556,265.697,248.844,233.771,220.368,208.247,
52     .                197.127,187.104,178.489,171.800,167.598,165.899,
53     .                165.676/
54      data   dt_epCLee/6.101 , 6.136 , 6.176 , 6.410 , 6.634 , 6.678 ,
55     .                 6.719 , 6.762 , 7.167 , 7.524 , 9.840 ,14.948 ,
56     .                21.370 ,28.746 ,36.373 ,43.315 ,48.534 ,51.175 ,
57     .                50.757 ,47.342 ,41.536 ,34.295 ,26.758 ,19.807 ,
58     .                14.001 , 9.599 , 6.504 , 4.439 , 3.126 , 2.370 ,
59     .                2.000/
60c
61
[2486]62      logical,save :: firstcall=.true.
[3]63     
64c  Initialisations
65c-----------------
66
67      if (firstcall) then
[2486]68        ! build zt_eq(), reference temperature field towards which to relax.
[3]69        PRINT*,"******* ATTENTION, NEWTONIAN COOLING ********"
70
71        pressCLee = etaCLee * 9.2e6
72
73        DO i = 1, klon
74       
75          do k = 1,klev
76         
77            level = 1
78            do j=1,nlevCLee
[2486]79              if (pressCLee(j).gt.presnivs(k)) level = j
[3]80            enddo
81           
[2486]82            fact  = (log10(presnivs(k))-log10(pressCLee(level)))
[3]83     .        /(log10(pressCLee(level+1))-log10(pressCLee(level)))
84            ztemp = tempCLee(level)*(1-fact)+tempCLee(level+1)*fact
85            zdt   = dt_epCLee(level)*(1-fact)+dt_epCLee(level+1)*fact
[1545]86c           zt_eq(i,k) = ztemp + zdt*(cos(latitude(i))-2./RPI)
87            zt_eq(i,k) = ztemp + zdt*(cos(latitude(i))-RPI/4.)
[3]88           
89          enddo
90         
91        ENDDO !i
92
[2486]93        firstcall = .false.
[3]94      endif ! firstcall
95     
96c+++++++ BOUCLE SUR LA GRILLE +++++++++++++++++++++++++
97      DO j = 1,klon
98 
99          do k = 1,klev
[2135]100             dTsdt(k) = -(pt(j,k)-zt_eq(j,k))/tauCLee   ! en K/s
[3]101          enddo
102       
103         radsol(j) = 0.           ! + vers bas
104         topsw(j) = 0.            ! + vers bas
105         toplw(j) = 0.            ! + vers haut
106         solsw(j) = 0.            ! + vers bas
107         sollw(j) = 0.            ! + vers bas
108         sollwdown(j) = 0.        ! + vers bas
109
[892]110        DO k = 1, klev+1
[3]111         lwnet  (j,k)   = 0.
112         swnet  (j,k)   = 0.
113        ENDDO
114
[892]115        DO k = 1, klev
[1301]116         heat (j,k) = dTsdt(k)    ! K/s
[3]117         cool (j,k) = 0.
118        ENDDO
119c
120      ENDDO !j
121c+++++++ FIN BOUCLE SUR LA GRILLE +++++++++++++++++++++++++
122
[2486]123      END SUBROUTINE radlwsw_newtoncool
[3]124
[2486]125      END MODULE radlwsw_newtoncool_mod
Note: See TracBrowser for help on using the repository browser.