Changeset 4198 for dynamico_lmdz


Ignore:
Timestamp:
Dec 20, 2019, 12:00:02 PM (5 years ago)
Author:
dubos
Message:

simple_physics : cleanup radiative transfer

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

Legend:

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

    r4197 r4198  
    1414      USE astronomy
    1515      USE vdif_mod, ONLY : vdif
    16       USE radiative, ONLY : mucorr
     16      USE radiative, ONLY : mucorr, sw
    1717c     
    1818      IMPLICIT NONE
  • dynamico_lmdz/simple_physics/phyparam/physics/radiative.F90

    r4197 r4198  
    22  IMPLICIT NONE
    33  SAVE
     4 
     5  PRIVATE
     6
     7  PUBLIC :: mucorr, sw
    48
    59CONTAINS
    6 
    7   SUBROUTINE mucorr(npts,pdeclin, plat, pmu, pfract,phaut,prad)
    8 
     10 
     11  PURE SUBROUTINE mucorr(npts,pdeclin, plat, pmu, pfract,phaut,prad)
     12   
     13    !=======================================================================
     14    !
     15    !   Calcul of equivalent solar angle and and fraction of day whithout
     16    !   diurnal cycle.
     17    !
     18    !   parmeters :
     19    !   -----------
     20    !
     21    !      Input :
     22    !      -------
     23    !         npts             number of points
     24    !         pdeclin          solar declinaison
     25    !         plat(npts)        latitude
     26    !         phaut            hauteur typique de l'atmosphere
     27    !         prad             rayon planetaire
     28    !
     29    !      Output :
     30    !      --------
     31    !         pmu(npts)          equivalent cosinus of the solar angle
     32    !         pfract(npts)       fractionnal day
     33    !
     34    !=======================================================================
     35   
     36    !-----------------------------------------------------------------------
     37    !
     38    !    0. Declarations :
     39    !    -----------------
     40   
     41    !     Arguments :
     42    !     -----------
     43    INTEGER, INTENT(IN) :: npts
     44    REAL, INTENT(IN)    :: phaut, prad, pdeclin, plat(npts)
     45    REAL, INTENT(OUT)   :: pmu(npts), pfract(npts)
     46    !
     47    !     Local variables :
     48    !     -----------------
     49    INTEGER j
     50    REAL z,cz,sz,tz,phi,cphi,sphi,tphi
     51    REAL ap,a,t,b
     52    REAL alph
     53
     54    REAL, PARAMETER :: pi=2.*asin(1.)
     55
     56    !-----------------------------------------------------------------------
     57   
     58!    print*,'npts,pdeclin',npts,pdeclin
     59    z = pdeclin
     60    cz = cos (z)
     61    sz = sin (z)
     62!    print*,'cz,sz',cz,sz
     63   
     64    DO j = 1, npts
     65       
     66       phi = plat(j)
     67       cphi = cos(phi)
     68       if (cphi.le.1.e-9) cphi=1.e-9
     69       sphi = sin(phi)
     70       tphi = sphi / cphi
     71       b = cphi * cz
     72       t = -tphi * sz / cz
     73       a = 1.0 - t*t
     74       ap = a
     75       
     76       IF(t.eq.0.) then
     77          t=0.5*pi
     78       ELSE
     79          IF (a.lt.0.) a = 0.
     80          t = sqrt(a) / t
     81          IF (t.lt.0.) then
     82             t = -atan (-t) + pi
     83          ELSE
     84             t = atan(t)
     85          ENDIF
     86       ENDIF
     87       
     88       pmu(j) = (sphi*sz*t) / pi + b*sin(t)/pi
     89       pfract(j) = t / pi
     90       IF (ap .lt.0.) then
     91          pmu(j) = sphi * sz
     92          pfract(j) = 1.0
     93       ENDIF
     94       IF (pmu(j).le.0.0) pmu(j) = 0.0
     95       pmu(j) = pmu(j) / pfract(j)
     96       IF (pmu(j).eq.0.) pfract(j) = 0.
     97       
     98    END DO
     99   
     100    !-----------------------------------------------------------------------
     101    !   correction de rotondite:
     102    !   ------------------------
     103   
     104    alph=phaut/prad
     105    DO j=1,npts
     106       ! !!!!!!
     107       pmu(j)=sqrt(1224.*pmu(j)*pmu(j)+1.)/35.
     108       !    $          (sqrt(alph*alph*pmu(j)*pmu(j)+2.*alph+1.)-alph*pmu(j))
     109    END DO
     110   
     111  END SUBROUTINE mucorr
     112 
     113  PURE SUBROUTINE monGATHER(n,a,b,index)     
     114    INTEGER, INTENT(IN) ::  n,index(n)
     115    REAL, INTENT(IN) :: b(n)
     116    REAL, INTENT(OUT) :: a(n)
     117    INTEGER :: i
     118
     119    DO i=1,n
     120       a(i)=b(index(i))
     121    END DO
     122  END SUBROUTINE monGATHER
     123 
     124  SUBROUTINE sw(ngrid,nlayer,ldiurn, &
     125       coefvis,albedo, &
     126       plevel,ps_rad,pmu,pfract,psolarf0, &
     127       fsrfvis,dtsw, &
     128       lwrite)
     129    USE phys_const
    9130!=======================================================================
    10131!
    11 !   Calcul of equivalent solar angle and and fraction of day whithout
    12 !   diurnal cycle.
    13 !
    14 !   parmeters :
    15 !   -----------
    16 !
    17 !      Input :
    18 !      -------
    19 !         npts             number of points
    20 !         pdeclin          solar declinaison
    21 !         plat(npts)        latitude
    22 !         phaut            hauteur typique de l'atmosphere
    23 !         prad             rayon planetaire
    24 !
    25 !      Output :
    26 !      --------
    27 !         pmu(npts)          equivalent cosinus of the solar angle
    28 !         pfract(npts)       fractionnal day
     132!   Rayonnement solaire en atmosphere non diffusante avec un
     133!   coefficient d'absoprption gris.
    29134!
    30135!=======================================================================
    31 
    32 !-----------------------------------------------------------------------
    33 !
    34 !    0. Declarations :
    35 !    -----------------
    36 
    37 !     Arguments :
    38 !     -----------
    39       INTEGER npts
    40       REAL plat(npts),pmu(npts), pfract(npts)
    41       REAL phaut,prad,pdeclin
    42 !
    43 !     Local variables :
    44 !     -----------------
    45       INTEGER j
    46       REAL pi
    47       REAL z,cz,sz,tz,phi,cphi,sphi,tphi
    48       REAL ap,a,t,b
    49       REAL alph
    50 
    51 !-----------------------------------------------------------------------
    52 
    53       print*,'npts,pdeclin'
    54       print*,npts,pdeclin
    55       pi = 4. * atan(1.0)
    56       print*,'PI=',pi
    57       pi=2.*asin(1.)
    58       print*,'PI=B',pi
    59       z = pdeclin
    60       cz = cos (z)
    61       sz = sin (z)
    62        print*,'cz,sz',cz,sz
    63 
    64       DO j = 1, npts
    65 
    66          phi = plat(j)
    67          cphi = cos(phi)
    68          if (cphi.le.1.e-9) cphi=1.e-9
    69          sphi = sin(phi)
    70          tphi = sphi / cphi
    71          b = cphi * cz
    72          t = -tphi * sz / cz
    73          a = 1.0 - t*t
    74          ap = a
    75    
    76          IF(t.eq.0.) then
    77             t=0.5*pi
    78          ELSE
    79             IF (a.lt.0.) a = 0.
    80             t = sqrt(a) / t
    81             IF (t.lt.0.) then
    82                t = -atan (-t) + pi
    83             ELSE
    84                t = atan(t)
     136!
     137!   declarations:
     138!   -------------
     139!
     140!
     141!   arguments:
     142!   ----------
     143!
     144      INTEGER ngrid,nlayer
     145      REAL albedo(ngrid),coefvis
     146      REAL pmu(ngrid),pfract(ngrid)
     147      REAL plevel(ngrid,nlayer+1),ps_rad
     148      REAL psolarf0
     149      REAL fsrfvis(ngrid),dtsw(ngrid,nlayer)
     150      LOGICAL lwrite,ldiurn
     151!
     152!   variables locales:
     153!   ------------------
     154!
     155
     156      REAL zalb(ngrid),zmu(ngrid),zfract(ngrid)
     157      REAL zplev(ngrid,nlayer+1)
     158      REAL zflux(ngrid),zdtsw(ngrid,nlayer)
     159
     160      INTEGER ig,l,nlevel,index(ngrid),ncount,igout
     161      REAL ztrdir(ngrid,nlayer+1),ztrref(ngrid,nlayer+1)
     162      REAL zfsrfref(ngrid)
     163      REAL z1(ngrid)
     164      REAL zu(ngrid,nlayer+1)
     165      REAL tau0
     166
     167!-----------------------------------------------------------------------
     168!   1. initialisations:
     169!   -------------------
     170
     171 
     172      nlevel=nlayer+1
     173
     174!-----------------------------------------------------------------------
     175!   Definitions des tableaux locaux pour les points ensoleilles:
     176!   ------------------------------------------------------------
     177
     178      IF (ldiurn) THEN
     179         ncount=0
     180         DO ig=1,ngrid
     181            index(ig)=0
     182         ENDDO
     183         DO ig=1,ngrid
     184            IF(pfract(ig).GT.1.e-6) THEN
     185               ncount=ncount+1
     186               index(ncount)=ig
    85187            ENDIF
    86          ENDIF
    87    
    88          pmu(j) = (sphi*sz*t) / pi + b*sin(t)/pi
    89          pfract(j) = t / pi
    90          IF (ap .lt.0.) then
    91             pmu(j) = sphi * sz
    92             pfract(j) = 1.0
    93          ENDIF
    94          IF (pmu(j).le.0.0) pmu(j) = 0.0
    95          pmu(j) = pmu(j) / pfract(j)
    96          IF (pmu(j).eq.0.) pfract(j) = 0.
    97 
    98       END DO
    99 
    100 !-----------------------------------------------------------------------
    101 !   correction de rotondite:
     188         ENDDO
     189         CALL monGATHER(ncount,zfract,pfract,index)
     190         CALL monGATHER(ncount,zmu,pmu,index)
     191         CALL monGATHER(ncount,zalb,albedo,index)
     192         DO l=1,nlevel
     193            CALL monGATHER(ncount,zplev(1,l),plevel(1,l),index)
     194         ENDDO
     195      ELSE
     196         ncount=ngrid
     197         zfract(:)=pfract(:)
     198         zmu(:)=pmu(:)
     199         zalb(:)=albedo(:)
     200         zplev(:,:)=plevel(:,:)
     201      ENDIF
     202
     203!-----------------------------------------------------------------------
     204!   calcul des profondeurs optiques integres depuis p=0:
     205!   ----------------------------------------------------
     206
     207      tau0=-.5*log(coefvis)
     208
     209! calcul de la partie homogene de l'opacite
     210      tau0=tau0/ps_rad
     211      DO l=1,nlayer+1
     212         DO ig=1,ncount
     213            zu(ig,l)=tau0*zplev(ig,l)
     214         ENDDO
     215      ENDDO
     216
     217!-----------------------------------------------------------------------
     218!   2. calcul de la transmission depuis le sommet de l'atmosphere:
     219!   -----------------------------------------------------------
     220
     221      DO l=1,nlevel
     222         DO ig=1,ncount
     223            ztrdir(ig,l)=exp(-zu(ig,l)/zmu(ig))
     224         ENDDO
     225      ENDDO
     226
     227      IF (lwrite) THEN
     228         igout=ncount/2+1
     229         PRINT*
     230         PRINT*,'Diagnostique des transmission dans le spectre solaire'
     231         PRINT*,'zfract, zmu, zalb'
     232         PRINT*,zfract(igout), zmu(igout), zalb(igout)
     233         PRINT*,'Pression, quantite d abs, transmission'
     234         DO l=1,nlayer+1
     235            PRINT*,zplev(igout,l),zu(igout,l),ztrdir(igout,l)
     236         ENDDO
     237      ENDIF
     238
     239!-----------------------------------------------------------------------
     240!   3. taux de chauffage, ray. solaire direct:
     241!   ------------------------------------------
     242
     243      DO l=1,nlayer
     244         DO ig=1,ncount
     245            zdtsw(ig,l)=g*psolarf0*zfract(ig)*zmu(ig)*      &
     246                          (ztrdir(ig,l+1)-ztrdir(ig,l))/    &
     247                          (cpp*(zplev(ig,l)-zplev(ig,l+1)))
     248         ENDDO
     249      ENDDO
     250      IF (lwrite) THEN
     251         PRINT*
     252         PRINT*,'Diagnostique des taux de chauffage solaires:'
     253         PRINT*,' 1 taux de chauffage lie au ray. solaire  direct'
     254         DO l=1,nlayer
     255            PRINT*,zdtsw(igout,l)
     256         ENDDO
     257      ENDIF
     258
     259
     260!-----------------------------------------------------------------------
     261!   4. calcul du flux solaire arrivant sur le sol:
     262!   ----------------------------------------------
     263
     264      DO ig=1,ncount
     265         z1(ig)=zfract(ig)*zmu(ig)*psolarf0*ztrdir(ig,1)
     266         zflux(ig)=(1.-zalb(ig))*z1(ig)
     267         zfsrfref(ig)=    zalb(ig)*z1(ig)
     268      ENDDO
     269      IF (lwrite) THEN
     270         PRINT*
     271         PRINT*,'Diagnostique des taux de chauffage solaires:'
     272         PRINT*,' 2 flux solaire net incident sur le sol'
     273         PRINT*,zflux(igout)
     274      ENDIF
     275
     276
     277!-----------------------------------------------------------------------
     278!   5.calcul des traansmissions depuis le sol, cas diffus:
     279!   ------------------------------------------------------
     280
     281      DO l=1,nlevel
     282         DO ig=1,ncount
     283            ztrref(ig,l)=exp(-(zu(ig,1)-zu(ig,l))*1.66)
     284         ENDDO
     285      ENDDO
     286
     287      IF (lwrite) THEN
     288         PRINT*
     289         PRINT*,'Diagnostique des taux de chauffage solaires'
     290         PRINT*,' 3 transmission avec les sol'
     291         PRINT*,'niveau     transmission'
     292         DO l=1,nlevel
     293            PRINT*,l,ztrref(igout,l)
     294         ENDDO
     295      ENDIF
     296
     297!-----------------------------------------------------------------------
     298!   6.ajout a l'echauffement de la contribution du ray. sol. reflechit:
     299!   -------------------------------------------------------------------
     300
     301      DO l=1,nlayer
     302         DO ig=1,ncount
     303            zdtsw(ig,l)=zdtsw(ig,l)+ &
     304                 g*zfsrfref(ig)*(ztrref(ig,l+1)-ztrref(ig,l))/ &
     305                 (cpp*(zplev(ig,l+1)-zplev(ig,l)))
     306         ENDDO
     307      ENDDO
     308
     309!-----------------------------------------------------------------------
     310!   10. sorites eventuelles:
    102311!   ------------------------
    103312
    104       alph=phaut/prad
    105       DO j=1,npts
    106 ! !!!!!!
    107          pmu(j)=sqrt(1224.*pmu(j)*pmu(j)+1.)/35.
    108 !    $          (sqrt(alph*alph*pmu(j)*pmu(j)+2.*alph+1.)-alph*pmu(j))
    109       END DO
    110 
    111     END SUBROUTINE mucorr
    112 
    113   END MODULE radiative
     313      IF (lwrite) THEN
     314         PRINT*
     315         PRINT*,'Diagnostique des taux de chauffage solaires:'
     316         PRINT*,' 3 taux de chauffage total'
     317         DO l=1,nlayer
     318            PRINT*,zdtsw(igout,l)
     319         ENDDO
     320      ENDIF
     321
     322      IF (ldiurn) THEN
     323         fsrfvis(:)=0.
     324         CALL monscatter(ncount,fsrfvis,index,zflux)
     325         dtsw(:,:)=0.
     326         DO l=1,nlayer
     327            CALL monscatter(ncount,dtsw(1,l),index,zdtsw(1,l))
     328         ENDDO
     329      ELSE
     330         print*,'NOT DIURNE'
     331         fsrfvis(:)=zflux(:)
     332         dtsw(:,:)=zdtsw(:,:)
     333      ENDIF
     334!        call dump2d(iim,jjm-1,zflux(2),'ZFLUX      ')
     335!        call dump2d(iim,jjm-1,fsrfvis(2),'FSRVIS     ')
     336!        call dump2d(iim,jjm-1,ztrdir(2,1),'ztrdir     ')
     337!        call dump2d(iim,jjm-1,pmu(2),'pmu        ')
     338!        call dump2d(iim,jjm-1,pfract(2),'pfract     ')
     339!        call dump2d(iim,jjm-1,albedo(2),'albedo     ')
     340!        call dump2d(iim,jjm-1,ztrdir(2,1),'ztrdir     ')
     341
     342
     343    END SUBROUTINE sw
     344
     345END MODULE radiative
Note: See TracChangeset for help on using the changeset viewer.