Ignore:
Timestamp:
Dec 30, 2019, 3:46:20 PM (5 years ago)
Author:
dubos
Message:

simple_physics : moved soil.F90 to module surface.F90 + cleanup

Location:
dynamico_lmdz/simple_physics/phyparam
Files:
2 deleted
2 edited
1 moved

Legend:

Unmodified
Added
Removed
  • dynamico_lmdz/simple_physics/phyparam/param/iniphyparam.F

    r4202 r4208  
    1515      USE astronomy
    1616      USE turbulence, ONLY : lmixmin, emin_turb
     17      USE surface
    1718      IMPLICIT NONE
    1819
     
    5253 
    5354#include "callkeys.h"
    54 #include "surface.h"
    5555#include "iniprint.h"
    5656
  • dynamico_lmdz/simple_physics/phyparam/param/phyparam.F

    r4205 r4208  
    1818      USE radiative_sw, ONLY : sw
    1919      USE radiative_lw, ONLY : lw
    20 
     20      USE surface
    2121c     
    2222      IMPLICIT NONE
     
    8383#include "dimensions.h"
    8484#include "callkeys.h"
    85 #include "surface.h"
     85c#include "surface.h"
    8686
    8787c    Arguments :
  • dynamico_lmdz/simple_physics/phyparam/physics/surface.F90

    r4207 r4208  
    1       SUBROUTINE soil(ngrid,nsoil,firstcall,ptherm_i,                   &
    2      &          ptimestep,ptsrf,ptsoil,                                 &
    3      &          pcapcal,pfluxgrd)                                       
    4       IMPLICIT NONE
    5                                                                        
    6 !=======================================================================
    7 !                                                                       
    8 !   Auteur:  Frederic Hourdin     30/01/92                             
    9 !   -------                                                             
    10 !                                                                       
    11 !   objet:  computation of : the soil temperature evolution             
    12 !   ------                   the surfacic heat capacity "Capcal"       
    13 !                            the surface conduction flux pcapcal       
    14 !                                                                       
    15 !                                                                       
    16 !   Method: implicit time integration                                   
    17 !   -------                                                             
    18 !   Consecutive ground temperatures are related by:                     
    19 !           T(k+1) = C(k) + D(k)*T(k)  (1)                             
    20 !   the coefficients C and D are computed at the t-dt time-step.       
    21 !   Routine structure:                                                 
    22 !   1)new temperatures are computed  using (1)                         
    23 !   2)C and D coefficients are computed from the new temperature       
    24 !     profile for the t+dt time-step                                   
    25 !   3)the coefficients A and B are computed where the diffusive         
    26 !     fluxes at the t+dt time-step is given by                         
    27 !            Fdiff = A + B Ts(t+dt)                                     
    28 !     or     Fdiff = F0 + Capcal (Ts(t+dt)-Ts(t))/dt                   
    29 !            with F0 = A + B (Ts(t))                                   
    30 !                 Capcal = B*dt                                         
    31 !                                                                       
    32 !   Interface:                                                         
    33 !   ----------                                                         
    34 !                                                                       
    35 !   Arguments:                                                         
    36 !   ----------                                                         
    37 !   ngird               number of grid-points                           
    38 !   ptimestep              physical timestep (s)                       
    39 !   pto(ngrid,nsoil)     temperature at time-step t (K)                 
    40 !   ptn(ngrid,nsoil)     temperature at time step t+dt (K)             
    41 !   pcapcal(ngrid)      specific heat (W*m-2*s*K-1)                     
    42 !   pfluxgrd(ngrid)      surface diffusive flux from ground (Wm-2)     
    43 !                                                                       
    44 !=======================================================================
    45 !   declarations:                                                       
    46 !   -------------                                                       
    47                                                                        
    48                                                                        
    49 !-----------------------------------------------------------------------
    50 !  arguments                                                           
    51 !  ---------                                                           
    52                                                                        
    53       INTEGER ngrid,nsoil
    54       REAL ptimestep
    55       REAL ptsrf(ngrid),ptsoil(ngrid,nsoil),ptherm_i(ngrid)
    56       REAL pcapcal(ngrid),pfluxgrd(ngrid)
    57       LOGICAL firstcall
    58                                                                        
    59                                                                        
    60 !-----------------------------------------------------------------------
    61 !  local arrays                                                         
    62 !  ------------                                                         
    63                                                                        
    64       INTEGER ig,jk
    65       REAL za(ngrid),zb(ngrid)
    66       REAL zdz2(nsoil),z1(ngrid)
    67       REAL min_period,dalph_soil
    68                                                                        
    69 !   local saved variables:                                             
    70 !   ----------------------                                             
    71       REAL,SAVE :: lambda
    72       REAL,ALLOCATABLE,SAVE :: dz1(:),dz2(:),zc(:,:),zd(:,:)
    73 !$OMP THREADPRIVATE(dz1,dz2,zc,zd,lambda)                               
    74                                                                        
    75 !-----------------------------------------------------------------------
    76 !   Depthts:                                                           
    77 !   --------                                                           
    78                                                                        
    79       REAL fz,rk,fz1,rk1,rk2
    80       fz(rk)=fz1*(dalph_soil**rk-1.)/(dalph_soil-1.)
    81                                                                        
    82       print*,'firstcall soil ',firstcall
    83       IF (firstcall) THEN
    84                                                                        
    85 !-----------------------------------------------------------------------
    86 !   ground levels                                                       
    87 !   grnd=z/l where l is the skin depth of the diurnal cycle:           
    88 !   --------------------------------------------------------           
    89                                                                        
    90          print*,'nsoil,ngrid,firstcall=',nsoil,ngrid,firstcall
    91          ALLOCATE(dz1(nsoil),dz2(nsoil))
    92          ALLOCATE(zc(ngrid,nsoil),zd(ngrid,nsoil))
    93                                                                        
    94          min_period=20000.
    95          dalph_soil=2.
    96                                                                        
    97          OPEN(99,file='soil.def',status='old',form='formatted',err=9999)
    98          READ(99,*) min_period
    99          READ(99,*) dalph_soil
    100          PRINT*,'Discretization for the soil model'
    101          PRINT*,'First level e-folding depth',min_period,               &
    102      &   '   dalph',dalph_soil                                         
    103          CLOSE(99)
    104  9999    CONTINUE
    105                                                                        
    106 !   la premiere couche represente un dixieme de cycle diurne           
    107          fz1=sqrt(min_period/3.14)
    108                                                                        
    109          DO jk=1,nsoil
    110             rk1=jk
    111             rk2=jk-1
    112             dz2(jk)=fz(rk1)-fz(rk2)
    113          ENDDO
    114          DO jk=1,nsoil-1
    115             rk1=jk+.5
    116             rk2=jk-.5
    117             dz1(jk)=1./(fz(rk1)-fz(rk2))
    118          ENDDO
    119          lambda=fz(.5)*dz1(1)
    120          PRINT*,'full layers, intermediate layers (secoonds)'
    121          DO jk=1,nsoil
    122             rk=jk
    123             rk1=jk+.5
    124             rk2=jk-.5
    125             PRINT*,fz(rk1)*fz(rk2)*3.14,                                &
    126      &      fz(rk)*fz(rk)*3.14                                         
    127          ENDDO
    128                                                                        
    129 !   Initialisations:                                                   
    130 !   ----------------                                                   
    131                                                                        
    132       ELSE
    133 !-----------------------------------------------------------------------
    134 !   Computation of the soil temperatures using the Cgrd and Dgrd       
    135 !  coefficient computed at the previous time-step:                     
    136 !  -----------------------------------------------                     
    137                                                                        
    138 !    surface temperature                                               
    139          DO ig=1,ngrid
    140             ptsoil(ig,1)=(lambda*zc(ig,1)+ptsrf(ig))/                   &
    141      &      (lambda*(1.-zd(ig,1))+1.)                                   
    142          ENDDO
    143                                                                        
    144 !   other temperatures                                                 
    145          DO jk=1,nsoil-1
    146             DO ig=1,ngrid
    147                ptsoil(ig,jk+1)=zc(ig,jk)+zd(ig,jk)*ptsoil(ig,jk)
    148             ENDDO
    149          ENDDO
    150                                                                        
    151       ENDIF
    152 !-----------------------------------------------------------------------
    153 !   Computation of the Cgrd and Dgrd coefficient for the next step:     
    154 !   ---------------------------------------------------------------     
    155                                                                        
    156       DO jk=1,nsoil
    157          zdz2(jk)=dz2(jk)/ptimestep
    158       ENDDO
    159                                                                        
    160       DO ig=1,ngrid
    161          z1(ig)=zdz2(nsoil)+dz1(nsoil-1)
    162          zc(ig,nsoil-1)=zdz2(nsoil)*ptsoil(ig,nsoil)/z1(ig)
    163          zd(ig,nsoil-1)=dz1(nsoil-1)/z1(ig)
    164       ENDDO
    165                                                                        
    166       DO jk=nsoil-1,2,-1
    167          DO ig=1,ngrid
    168             z1(ig)=1./(zdz2(jk)+dz1(jk-1)+dz1(jk)*(1.-zd(ig,jk)))
    169             zc(ig,jk-1)=                                                &
    170      &      (ptsoil(ig,jk)*zdz2(jk)+dz1(jk)*zc(ig,jk))*z1(ig)           
    171             zd(ig,jk-1)=dz1(jk-1)*z1(ig)
    172          ENDDO
    173       ENDDO
    174                                                                        
    175 !-----------------------------------------------------------------------
    176 !   computation of the surface diffusive flux from ground and           
    177 !   calorific capacity of the ground:                                   
    178 !   ---------------------------------                                   
    179                                                                        
    180       DO ig=1,ngrid
    181          pfluxgrd(ig)=ptherm_i(ig)*dz1(1)*                              &
    182      &   (zc(ig,1)+(zd(ig,1)-1.)*ptsoil(ig,1))                         
    183          pcapcal(ig)=ptherm_i(ig)*                                      &
    184      &   (dz2(1)+ptimestep*(1.-zd(ig,1))*dz1(1))                       
    185          z1(ig)=lambda*(1.-zd(ig,1))+1.
    186          pcapcal(ig)=pcapcal(ig)/z1(ig)
    187          pfluxgrd(ig)=pfluxgrd(ig)                                      &
    188      &   +pcapcal(ig)*(ptsoil(ig,1)*z1(ig)-lambda*zc(ig,1)-ptsrf(ig))   &
    189      &   /ptimestep                                                     
    190       ENDDO
    191                                                                        
    192       RETURN
    193       END                                           
     1MODULE surface
     2  IMPLICIT NONE
     3  PRIVATE
     4  SAVE
     5
     6  REAL, PARAMETER :: pi=2.*ASIN(1.)
     7
     8  ! common variables
     9  REAL, PUBLIC ::  I_mer,I_ter,Cd_mer,Cd_ter, &
     10       &           alb_mer,alb_ter,emi_mer,emi_ter
     11
     12  !   local saved variables:                                             
     13  !   ----------------------                                             
     14  REAL :: lambda
     15  REAL,ALLOCATABLE :: dz1(:),dz2(:),zc(:,:),zd(:,:)
     16  !$OMP THREADPRIVATE(dz1,dz2,zc,zd,lambda)                               
     17
     18  PUBLIC :: soil
     19
     20CONTAINS
     21
     22  SUBROUTINE init_soil(ngrid,nsoil)
     23    INTEGER, INTENT(IN) :: ngrid, nsoil
     24    REAL min_period,dalph_soil
     25    REAL fz,rk,fz1,rk1,rk2
     26    INTEGER :: jk
     27
     28    ! this is a function definition
     29    fz(rk)=fz1*(dalph_soil**rk-1.)/(dalph_soil-1.)
     30   
     31    !-----------------------------------------------------------------------
     32    !   ground levels                                                       
     33    !   grnd=z/l where l is the skin depth of the diurnal cycle:           
     34    !   --------------------------------------------------------           
     35   
     36    print*,'nsoil,ngrid,firstcall=',nsoil,ngrid, .TRUE.
     37    ALLOCATE(dz1(nsoil),dz2(nsoil))
     38    ALLOCATE(zc(ngrid,nsoil),zd(ngrid,nsoil))
     39   
     40    min_period=20000.
     41    dalph_soil=2.
     42   
     43    !   la premiere couche represente un dixieme de cycle diurne           
     44    fz1=sqrt(min_period/pi)
     45   
     46    DO jk=1,nsoil
     47       rk1=jk
     48       rk2=jk-1
     49       dz2(jk)=fz(rk1)-fz(rk2)
     50    ENDDO
     51    DO jk=1,nsoil-1
     52       rk1=jk+.5
     53       rk2=jk-.5
     54       dz1(jk)=1./(fz(rk1)-fz(rk2))
     55    ENDDO
     56    lambda=fz(.5)*dz1(1)
     57    PRINT*,'full layers, intermediate layers (secoonds)'
     58    DO jk=1,nsoil
     59       rk=jk
     60       rk1=jk+.5
     61       rk2=jk-.5
     62       PRINT*,fz(rk1)*fz(rk2)*pi,        &
     63            &      fz(rk)*fz(rk)*pi                                         
     64    ENDDO
     65   
     66  END SUBROUTINE init_soil
     67 
     68  SUBROUTINE soil(ngrid,nsoil,firstcall,ptherm_i,          &
     69       &          ptimestep,ptsrf,ptsoil,                  &
     70       &          pcapcal,pfluxgrd)                                       
     71   
     72    !=======================================================================
     73    !                                                                       
     74    !   Auteur:  Frederic Hourdin     30/01/92                             
     75    !   -------                                                             
     76    !                                                                       
     77    !   objet:  computation of : the soil temperature evolution             
     78    !   ------                   the surfacic heat capacity "Capcal"       
     79    !                            the surface conduction flux pcapcal       
     80    !                                                                       
     81    !                                                                       
     82    !   Method: implicit time integration                                   
     83    !   -------                                                             
     84    !   Consecutive ground temperatures are related by:                     
     85    !           T(k+1) = C(k) + D(k)*T(k)  (1)                             
     86    !   the coefficients C and D are computed at the t-dt time-step.       
     87    !   Routine structure:                                                 
     88    !   1)new temperatures are computed  using (1)                         
     89    !   2)C and D coefficients are computed from the new temperature       
     90    !     profile for the t+dt time-step                                   
     91    !   3)the coefficients A and B are computed where the diffusive         
     92    !     fluxes at the t+dt time-step is given by                         
     93    !            Fdiff = A + B Ts(t+dt)                                     
     94    !     or     Fdiff = F0 + Capcal (Ts(t+dt)-Ts(t))/dt                   
     95    !            with F0 = A + B (Ts(t))                                   
     96    !                 Capcal = B*dt                                         
     97    !                                                                       
     98    !   Interface:                                                         
     99    !   ----------                                                         
     100    !                                                                       
     101    !   Arguments:                                                         
     102    !   ----------                                                         
     103    !   ngrid               number of grid-points                           
     104    !   ptimestep              physical timestep (s)                       
     105    !   pto(ngrid,nsoil)     temperature at time-step t (K)                 
     106    !   ptn(ngrid,nsoil)     temperature at time step t+dt (K)             
     107    !   pcapcal(ngrid)      specific heat (W*m-2*s*K-1)                     
     108    !   pfluxgrd(ngrid)      surface diffusive flux from ground (Wm-2)     
     109    !                                                                       
     110    !=======================================================================
     111    !   declarations:                                                       
     112    !   -------------                                                       
     113   
     114   
     115    !-----------------------------------------------------------------------
     116    !  arguments                                                           
     117    !  ---------                                                           
     118   
     119    INTEGER ngrid,nsoil
     120    REAL ptimestep
     121    REAL ptsrf(ngrid),ptsoil(ngrid,nsoil),ptherm_i(ngrid)
     122    REAL pcapcal(ngrid),pfluxgrd(ngrid)
     123    LOGICAL firstcall
     124   
     125   
     126    !-----------------------------------------------------------------------
     127    !  local arrays                                                         
     128    !  ------------                                                         
     129   
     130    INTEGER ig,jk
     131    REAL za(ngrid),zb(ngrid)
     132    REAL zdz2(nsoil),z1(ngrid)
     133       
     134    print*,'firstcall soil ',firstcall
     135    IF (firstcall) THEN
     136       CALL init_soil(ngrid, nsoil)
     137    ELSE
     138       !-----------------------------------------------------------------------
     139       !   Computation of the soil temperatures using the Cgrd and Dgrd       
     140       !  coefficient computed at the previous time-step:                     
     141       !  -----------------------------------------------                     
     142       
     143       !    surface temperature                                               
     144       DO ig=1,ngrid
     145          ptsoil(ig,1)=(lambda*zc(ig,1)+ptsrf(ig))/                   &
     146               &      (lambda*(1.-zd(ig,1))+1.)                                   
     147       ENDDO
     148       
     149       !   other temperatures                                                 
     150       DO jk=1,nsoil-1
     151          DO ig=1,ngrid
     152             ptsoil(ig,jk+1)=zc(ig,jk)+zd(ig,jk)*ptsoil(ig,jk)
     153          ENDDO
     154       ENDDO
     155       
     156    ENDIF
     157
     158    !-----------------------------------------------------------------------
     159    !   Computation of the Cgrd and Dgrd coefficient for the next step:     
     160    !   ---------------------------------------------------------------     
     161   
     162    DO jk=1,nsoil
     163       zdz2(jk)=dz2(jk)/ptimestep
     164    ENDDO
     165   
     166    DO ig=1,ngrid
     167       z1(ig)=zdz2(nsoil)+dz1(nsoil-1)
     168       zc(ig,nsoil-1)=zdz2(nsoil)*ptsoil(ig,nsoil)/z1(ig)
     169       zd(ig,nsoil-1)=dz1(nsoil-1)/z1(ig)
     170    ENDDO
     171   
     172    DO jk=nsoil-1,2,-1
     173       DO ig=1,ngrid
     174          z1(ig)=1./(zdz2(jk)+dz1(jk-1)+dz1(jk)*(1.-zd(ig,jk)))
     175          zc(ig,jk-1)=                                                &
     176               &      (ptsoil(ig,jk)*zdz2(jk)+dz1(jk)*zc(ig,jk))*z1(ig)           
     177          zd(ig,jk-1)=dz1(jk-1)*z1(ig)
     178       ENDDO
     179    ENDDO
     180   
     181    !-----------------------------------------------------------------------
     182    !   computation of the surface diffusive flux from ground and           
     183    !   calorific capacity of the ground:                                   
     184    !   ---------------------------------                                   
     185   
     186    DO ig=1,ngrid
     187       pfluxgrd(ig)=ptherm_i(ig)*dz1(1)*                              &
     188            &   (zc(ig,1)+(zd(ig,1)-1.)*ptsoil(ig,1))
     189       z1(ig)=lambda*(1.-zd(ig,1))+1.
     190       pcapcal(ig)=ptherm_i(ig)*                                      &
     191            &   ptimestep*(zdz2(1)+(1.-zd(ig,1))*dz1(1))/z1(ig)
     192       pfluxgrd(ig)=pfluxgrd(ig)                                      &
     193            &   +pcapcal(ig)*(ptsoil(ig,1)*z1(ig)-lambda*zc(ig,1)-ptsrf(ig))   &
     194            &   /ptimestep                                                     
     195    ENDDO
     196   
     197  END SUBROUTINE soil
     198 
     199END MODULE surface
Note: See TracChangeset for help on using the changeset viewer.