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

Last change on this file since 3567 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
Line 
1!
2! $Header: /home/cvsroot/LMDZ4/libf/phylmd/radlwsw.F,v 1.2 2004/10/27 10:14:46 lmdzadmin Exp $
3!
4      MODULE radlwsw_newtoncool_mod
5     
6      implicit none
7     
8      contains
9     
10      SUBROUTINE radlwsw_newtoncool(presnivs,pt)
11     
12c======================================================================
13c   S. Lebonnois    12/04/2007
14c  VERSION NEWTONIAN COOLING pour Venus (no diurnal cycle)
15c  update 01/2014
16c======================================================================
17      use dimphy, only: klon,klev
18      USE geometry_mod, ONLY: latitude ! in radians
19      USE phys_state_var_mod, only: heat,cool,radsol,
20     .  topsw,toplw,solsw,sollw,sollwdown,lwnet,swnet,zt_eq
21
22      IMPLICIT none
23      include "YOMCST.h"
24
25c ARGUMENTS
26 
27      real,intent(in) :: presnivs(klev) ! approx. pressure of GCM levels (Pa)
28      real,intent(in) :: pt(klon,klev) ! atmospheric temperature (K)
29 
30c LOCAL VARIABLES
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
39      real   dTsdt(klev)
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
62      logical,save :: firstcall=.true.
63     
64c  Initialisations
65c-----------------
66
67      if (firstcall) then
68        ! build zt_eq(), reference temperature field towards which to relax.
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
79              if (pressCLee(j).gt.presnivs(k)) level = j
80            enddo
81           
82            fact  = (log10(presnivs(k))-log10(pressCLee(level)))
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
86c           zt_eq(i,k) = ztemp + zdt*(cos(latitude(i))-2./RPI)
87            zt_eq(i,k) = ztemp + zdt*(cos(latitude(i))-RPI/4.)
88           
89          enddo
90         
91        ENDDO !i
92
93        firstcall = .false.
94      endif ! firstcall
95     
96c+++++++ BOUCLE SUR LA GRILLE +++++++++++++++++++++++++
97      DO j = 1,klon
98 
99          do k = 1,klev
100             dTsdt(k) = -(pt(j,k)-zt_eq(j,k))/tauCLee   ! en K/s
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
110        DO k = 1, klev+1
111         lwnet  (j,k)   = 0.
112         swnet  (j,k)   = 0.
113        ENDDO
114
115        DO k = 1, klev
116         heat (j,k) = dTsdt(k)    ! K/s
117         cool (j,k) = 0.
118        ENDDO
119c
120      ENDDO !j
121c+++++++ FIN BOUCLE SUR LA GRILLE +++++++++++++++++++++++++
122
123      END SUBROUTINE radlwsw_newtoncool
124
125      END MODULE radlwsw_newtoncool_mod
Note: See TracBrowser for help on using the repository browser.