Ignore:
Timestamp:
Feb 6, 2026, 10:20:21 PM (3 weeks ago)
Author:
mturbet
Message:

Cleaning of continuum routines following 04-02-26 hackathon. RIP our beloved bilinear and bilinearbig routines. You will be deeply missed...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.GENERIC/libf/phygeneric/optcv.F90

    r3797 r4055  
    1010
    1111  use radinc_h, only: L_NLAYRAD, L_NLEVRAD, L_LEVELS, L_NSPECTV, L_NGAUSS, L_REFVAR, NAERKIND
    12   use radcommon_h, only: gasv, tlimit, wrefVAR, Cmk, tgasref, pfgasref,wnov,scalep,indv,glat_ig
     12  use radcommon_h, only: gasv, tlimit, wrefVAR, Cmk, tgasref, pfgasref,wnov,scalep,glat_ig
    1313  use gases_h, only: gfrac, ngasmx, igas_H2, igas_H2O, igas_He, igas_N2, &
    1414                     igas_CH4, igas_CO2, igas_O2
    1515  use comcstfi_mod, only: g, r, mugaz
    1616  use callkeys_mod, only: kastprof,continuum,graybody,callgasvis,varspec, &
    17                           generic_continuum_database,rayleigh
     17                          rayleigh
    1818  use recombin_corrk_mod, only: corrk_recombin, gasv_recomb
    1919  use tpindex_mod, only: tpindex
     
    107107  integer igas, jgas
    108108
    109   integer interm
    110 
    111109  logical :: firstcall=.true.
    112110!$OMP THREADPRIVATE(firstcall)
     
    120118    firstcall=.false.
    121119  endif ! of if (firstcall)
    122 
    123   !! AS: to save time in computing continuum (see bilinearbig)
    124   IF (.not.ALLOCATED(indv)) THEN
    125       ALLOCATE(indv(L_NSPECTV,ngasmx,ngasmx))
    126       indv = -9999 ! this initial value means "to be calculated"
    127   ENDIF
    128120
    129121  !=======================================================================
     
    211203           ! include continua if necessary
    212204           
    213           if(generic_continuum_database)then
    214205            T_cont  = dble(TMID(k))
    215206            do igas=1,ngasmx
     
    261252               
    262253            enddo ! igas=1,ngasmx
    263            
    264           else ! generic_continuum_database
    265            
    266            
    267            wn_cont = dble(wnov(nw))
    268            T_cont  = dble(TMID(k))
    269            do igas=1,ngasmx
    270 
    271               if(gfrac(igas).eq.-1)then ! variable
    272                  p_cont  = dble(PMID(k)*scalep*QVAR(k)) ! qvar = mol/mol
    273               elseif(varspec) then
    274                  p_cont  = dble(PMID(k)*scalep*FRACVAR(igas,k)*(1.-QVAR(k)))
    275               else
    276                  p_cont  = dble(PMID(k)*scalep*gfrac(igas)*(1.-QVAR(k)))
    277               endif
    278 
    279               dtemp=0.0
    280               if(igas.eq.igas_N2)then
    281 
    282                  interm = indv(nw,igas,igas)
    283 !                 call interpolateN2N2(wn_cont,T_cont,p_cont,dtemp,.false.,interm)
    284                  indv(nw,igas,igas) = interm
    285                  ! only goes to 500 cm^-1, so unless we're around a cold brown dwarf, this is irrelevant in the visible
    286 
    287               elseif(igas.eq.igas_H2)then
    288 
    289                  ! first do self-induced absorption
    290                  interm = indv(nw,igas,igas)
    291                  call interpolateH2H2(wn_cont,T_cont,p_cont,dtemp,.false.,interm)
    292                  indv(nw,igas,igas) = interm
    293 
    294                  ! then cross-interactions with other gases
    295                  do jgas=1,ngasmx
    296                     if(varspec) then
    297                       p_cross = dble(PMID(k)*scalep*FRACVAR(jgas,k)*(1.-QVAR(k)))
    298                     else
    299                       p_cross = dble(PMID(k)*scalep*gfrac(jgas)*(1.-QVAR(k)))
    300                     endif
    301                     dtempc  = 0.0
    302                     if(jgas.eq.igas_N2)then
    303                        interm = indv(nw,igas,jgas)
    304                        call interpolateN2H2(wn_cont,T_cont,p_cross,p_cont,dtempc,.false.,interm)
    305                        indv(nw,igas,jgas) = interm
    306                        ! should be irrelevant in the visible
    307                     elseif(jgas.eq.igas_CO2)then
    308                        interm = indv(nw,igas,jgas)
    309                        call interpolateCO2H2(wn_cont,T_cont,p_cross,p_cont,dtempc,.false.,interm)
    310                        indv(nw,igas,jgas) = interm
    311                        ! might not be relevant in the visible
    312                     elseif(jgas.eq.igas_He)then
    313                        interm = indv(nw,igas,jgas)
    314                        call interpolateH2He(wn_cont,T_cont,p_cross,p_cont,dtempc,.false.,interm)
    315                        indv(nw,igas,jgas) = interm
    316                     endif
    317                     dtemp = dtemp + dtempc
    318                  enddo
    319                  
    320               elseif(igas.eq.igas_CH4)then
    321 
    322                  ! first do self-induced absorption
    323                  interm = indv(nw,igas,igas)
    324                  call interpolateCH4CH4(wn_cont,T_cont,p_cont,dtemp,.false.,interm)
    325                  indv(nw,igas,igas) = interm
    326 
    327                  ! then cross-interactions with other gases
    328                  do jgas=1,ngasmx
    329                     if(varspec) then
    330                       p_cross = dble(PMID(k)*scalep*FRACVAR(jgas,k)*(1.-QVAR(k)))
    331                     else
    332                       p_cross = dble(PMID(k)*scalep*gfrac(jgas)*(1.-QVAR(k)))
    333                     endif
    334                     dtempc  = 0.0d0
    335                     if(jgas.eq.igas_H2)then
    336                        interm = indv(nw,igas,jgas)
    337                        call interpolateH2CH4(wn_cont,T_cont,p_cross,p_cont,dtempc,.false.,interm)
    338                        indv(nw,igas,jgas) = interm
    339                     elseif(jgas.eq.igas_CO2)then
    340                        interm = indv(nw,igas,jgas)
    341                        call interpolateCO2CH4(wn_cont,T_cont,p_cross,p_cont,dtempc,.false.,interm)
    342                        indv(nw,igas,jgas) = interm
    343                        ! might not be relevant in the visible
    344                     elseif(jgas.eq.igas_He)then
    345                        interm = indv(nw,igas,jgas)
    346                        call interpolateHeCH4(wn_cont,T_cont,p_cross,p_cont,dtempc,.false.,interm)
    347                        indv(nw,igas,jgas) = interm
    348                     endif
    349                     dtemp = dtemp + dtempc
    350                  enddo
    351 
    352               elseif(igas.eq.igas_H2O.and.T_cont.gt.100.0)then
    353                  ! Compute self and foreign (with air) continuum of H2O
    354                  p_air = dble(PMID(k)*scalep) - p_cont ! note assumes background is air!
    355                  interm = indv(nw,igas,igas)
    356                  call interpolateH2O_self_foreign(wn_cont,T_cont,p_cont,p_air,dtemp,.false.,interm) ! MTCKD v3.3
    357                  indv(nw,igas,igas) = interm
    358 
    359               endif
    360 
    361               DCONT = DCONT + dtemp
    362 
    363            enddo
    364 
    365           endif ! generic_continuum_database
    366254         
    367255          DCONT = DCONT*dz(k)
Note: See TracChangeset for help on using the changeset viewer.