LCOV - code coverage report
Current view: top level - physics/waccmx - tei_mod.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 164 0.0 %
Date: 2025-03-14 01:26:08 Functions: 0 1 0.0 %

          Line data    Source code
       1             : !=======================================================================================================
       2             : ! extracted from TIEGCM model
       3             : ! see section 6.3 in https://www.hao.ucar.edu/modeling/tgcm/doc/description/model_description.pdf
       4             : !=======================================================================================================
       5             : module tei_mod
       6             :   !
       7             :   ! Calculate electron and ion temperatures.
       8             :   !
       9             :   use shr_kind_mod,  only : r8 => shr_kind_r8
      10             :   use shr_const_mod, only : pi => shr_const_pi           ! Boltzmann constant and pi
      11             :   use mo_constants,  only : gask => rgas_cgs
      12             :   use mo_constants,  only : boltz=>boltz_cgs
      13             :   use physconst,     only : avogad ! molecules/kmole
      14             : 
      15             :   implicit none
      16             :   private
      17             :   public :: settei
      18             : 
      19             :   ! g = 8.7 m/s at 400 km altitude
      20             :   real(r8), parameter :: grav   = 870._r8      ! (cm/s^2)
      21             :   real(r8), parameter :: dipmin = 0.24_r8      ! minimum mag dip angle (2.5 deg horizontal res)
      22             :   real(r8), parameter :: rtd = 180._r8/pi
      23             :   real(r8), parameter :: evergs = 1.602e-12_r8 ! 1 eV = 1.602e-12 ergs
      24             : 
      25             :   real(r8), parameter :: rmassinv_o2 = 1._r8/32._r8
      26             :   real(r8), parameter :: rmassinv_o1 = 1._r8/16._r8
      27             :   real(r8), parameter :: rmassinv_n2 = 1._r8/28._r8
      28             :   real(r8), parameter :: avo = avogad*1.e-3_r8 ! molecules/mole
      29             : contains
      30             : 
      31             :   ! 
      32           0 :   subroutine settei(tn,o2,o1,n2,ne,te,ti,op,o2p,nop,barm,qji_ti, &
      33           0 :        f107, chi, qtot, qteaur, rlatm, dipmag, pmid, pint, lev0, lev1,ncol, &
      34           0 :        te_out, ti_out, qtotal )
      35             : 
      36             :     use trsolv_mod, only : trsolv
      37             :     !
      38             :     ! Args:
      39             :     integer,intent(in) :: lev0,lev1,ncol
      40             :     real(r8),dimension(lev0:lev1,ncol),intent(in) :: &
      41             :          tn,    &   ! neutral temperature (deg K) 
      42             :          o2,    &   ! molecular oxygen (mmr) 
      43             :          o1,    &   ! atomic oxygen (mmr)
      44             :          n2,    &   ! molecular nitrogen (mmr)
      45             :          ne,    &   ! electron density (cm3)
      46             :          te,    &   ! electron temperature (from previous time step) (K)
      47             :          ti,    &   ! ion temperature (from previous time step) (K)
      48             :          op,    &   ! O+ number dens (/cm^3) 
      49             :          o2p,   &   ! O2+ number dens (/cm^3) 
      50             :          nop,   &   ! NO+ number dens (/cm^3) 
      51             :          barm,  &   ! mean molecular weight (g/mole)
      52             :          qji_ti     ! joule heating from qjoule_ti (used ui,vi)  ergs/s/g
      53             : 
      54             :     real(r8), intent(in) :: f107
      55             :     real(r8), intent(in) :: chi(ncol)              ! solar zenith angle (radians)
      56             :     real(r8), intent(in) :: qtot(lev0:lev1,ncol)   ! total ionization rate  (s-1 cm-3)
      57             :     real(r8), intent(in) :: qteaur(ncol)           ! (units ?? )
      58             :     real(r8), intent(in) :: rlatm(ncol)            ! geo mag latitude (radians)
      59             :     real(r8), intent(in) :: dipmag(ncol)           ! geo mag dip angle (radians)
      60             :     real(r8), intent(in) :: pmid(lev0:lev1,ncol)   ! mid-level press (dyne/cm^2)
      61             :     real(r8), intent(in) :: pint(lev0:lev1+1,ncol) ! interface press (dyne/cm^2)
      62             : 
      63             :     !
      64             :     ! Output args:
      65             :     real(r8),dimension(lev0:lev1,ncol),intent(out) :: &
      66             :          te_out, & ! output electron temperature (deg K) 
      67             :          ti_out    ! output ion temperature (deg K)
      68             :     real(r8), intent(out) :: qtotal(lev0:lev1,ncol)! (ergs/sec/gm)
      69             :     
      70             :     !
      71             :     ! Local:
      72             :     integer :: i,k,n,ier
      73             :     integer :: nk,nkm1
      74             :     real(r8),dimension(lev0:lev1,ncol) :: &
      75           0 :          xnmbar,    & ! p0*e(-z)*barm/kT  (minpoints or interfaces)
      76           0 :          p_coef,    & ! coefficient for trisolv     (s1)
      77           0 :          q_coef,    & ! coefficient for trisolv     (s2)
      78           0 :          r_coef,    & ! coefficient for trisolv     (s3)
      79           0 :          rhs          ! right-hand-side for trisolv (s4)
      80             :     real(r8),dimension(lev0:lev1) :: &
      81           0 :          te_int,    & ! electron temperature (interfaces)
      82           0 :          tn_int,    & ! neutral temperature (interfaces)
      83           0 :          o2n,       & ! O2 number density (interfaces)
      84           0 :          o1n,       & ! O1 number density (interfaces)
      85           0 :          n2n,       & ! N2 number density (interfaces)
      86           0 :          root_te,   & ! sqrt(te)
      87           0 :          root_tn,   & ! sqrt(tn)
      88           0 :          root_ne,   & ! sqrt(ne)
      89           0 :          tek0,      & ! ke/te**2.5 (s15)
      90           0 :          h_mid,h_int,&
      91           0 :          barm_int,&
      92             :          fki,       & ! work array
      93           0 :          qe,        & ! source term                 (s10)
      94           0 :          q_eni,     & ! heating from electron/neutral and electron/ion collisions
      95           0 :          coll_en2v, & ! electron/N2vib collision    (s9)
      96             :                                 !
      97             :                                 ! Cooling rates (heat loss):
      98           0 :          loss_en2v, & ! electron/N2vib loss term    (s10)
      99           0 :          loss_en2,  & ! electron/N2 loss
     100           0 :          loss_eo2,  & ! electron/O2 loss
     101           0 :          loss_eo1d, & ! electron/O(1d) loss
     102           0 :          loss_eo1,  & ! electron/O loss
     103           0 :          loss_xen,  & ! L0*(E,N) (s8)
     104           0 :          loss_en      ! electrons/neutrals loss     (s11)
     105             :     real(r8),dimension(lev0:lev1,ncol) :: &
     106           0 :          loss_ei,   & ! electron/ion loss           (s10)
     107           0 :          loss_in      ! ion/neutral loss            (s9)
     108             :     real(r8),parameter :: &
     109             :          fpolar = -3.0e+9_r8, & ! polar te flux
     110             :          del    = 1.e-6_r8  , & ! some small value
     111             :          root2 = sqrt(2._r8), &
     112             :    !
     113             :    ! Correction factors for neutral heating due to L(E,O1D)
     114             :          alam = 0.0069_r8   , &
     115             :          ad   = 0.0091_r8   , &
     116             :          sd   = 2.3e-11_r8
     117             :     real(r8) ::  &
     118             :          f107te   ! solar flux
     119             :     !
     120             :     ! a,fed,fen,fe,sindipmag have a z dimension only for diagnostic plotting:
     121             :     real(r8) :: &
     122             :          a,fed,fen,& ! day/night
     123             :          fe,       & ! heat flux at upper boundary
     124             :          sindipmag   ! sin(dipmag)
     125             :     !
     126           0 :     real(r8) :: dellnp(lev0:lev1) ! delta of log interface pressures
     127             : 
     128           0 :     qtotal(:,:) = 0._r8
     129             : 
     130           0 :     col_loop: do i=1,ncol
     131           0 :        do k=lev0,lev1
     132           0 :           dellnp(k) = abs(log(pint(k,i)) - log(pint(k+1,i)))
     133             :        end do
     134             :        !
     135           0 :        f107te = f107
     136           0 :        if (f107te > 235._r8) f107te = 235._r8
     137           0 :        nk = lev1-lev0+1
     138           0 :        nkm1 = nk-1
     139             :        !
     140           0 :        if (abs(rlatm(i))-pi/4.5_r8 >= 0._r8) then
     141             :           a = 1._r8
     142             :        else
     143           0 :           a = .5_r8*(1._r8+sin(pi*(abs(rlatm(i))-pi/9._r8)/(pi/4.5_r8)))
     144             :        endif
     145             :        !
     146             :        ! Increased heat flux for TE fom protonosphere.
     147           0 :        fed = ( -5.0e+7_r8*f107te*a-4.0e+7_r8*f107te)*1.2_r8
     148           0 :        fen = fed/2._r8
     149           0 :        fed = fed+qteaur(i)     ! t4
     150           0 :        fen = fen+qteaur(i)     ! t5
     151           0 :        if (chi(i)-.5_r8*pi >= 0._r8) then  ! chi==t2
     152             :           fe = fen                ! t1
     153             :        else
     154           0 :           fe = fed
     155             :        endif
     156           0 :        if ((chi(i)*rtd-80._r8)*(chi(i)*rtd-100._r8)>=0._r8) then
     157           0 :           fe = fe*evergs
     158             :        else
     159             :           fe = (.5_r8*(fed+fen)+.5_r8*(fed-fen)* &
     160           0 :                cos(pi*(chi(i)*rtd-80._r8)/20._r8))*evergs
     161             :        endif
     162             :        !
     163             :        ! Add fpolar if magnetic latitude >= 60 degrees:
     164           0 :        if (abs(rlatm(i)-pi/3._r8)>=0._r8) then
     165           0 :           fe = fe+fpolar*evergs
     166             :        end if
     167             : 
     168             :        !
     169             :        ! te,o2,o,n2,tn at interfaces: 
     170           0 :        do k=lev0+1,lev1-1
     171           0 :           te_int(k) = .5_r8*(te(k,i)+te(k-1,i))
     172           0 :           o2n(k)    = .5_r8*(o2(k,i)+o2(k-1,i))
     173           0 :           o1n(k)    = .5_r8*(o1(k,i)+o1(k-1,i))
     174           0 :           n2n(k)    = .5_r8*(n2(k,i)+n2(k-1,i))
     175           0 :           tn_int(k) = .5_r8*(tn(k,i)+tn(k-1,i))
     176           0 :           barm_int(k) = .5_r8*(barm(k,i)+barm(k-1,i))
     177             :        enddo ! k=lev0+1,lev1-2
     178             :        !
     179             :        ! Bottom:
     180           0 :        te_int(lev0) = 1.5_r8*te(lev0,i)-.5_r8*te(lev0+1,i)
     181           0 :        o2n(lev0)    = 1.5_r8*o2(lev0,i)-.5_r8*o2(lev0+1,i)
     182           0 :        o1n(lev0)    = 1.5_r8*o1(lev0,i)-.5_r8*o1(lev0+1,i)
     183           0 :        n2n(lev0)    = 1.5_r8*n2(lev0,i)-.5_r8*n2(lev0+1,i)
     184           0 :        tn_int(lev0) = 1.5_r8*tn(lev0,i)-.5_r8*tn(lev0+1,i)
     185           0 :        barm_int(lev0) = 1.5_r8*barm(lev0,i)-.5_r8*barm(lev0+1,i)
     186             :        !
     187             :        ! Top:
     188           0 :        te_int(lev1) = 1.5_r8*te(lev1-1,i)-.5_r8*te(lev1-2,i)
     189           0 :        o2n(lev1)    = 1.5_r8*o2(lev1-1,i)-.5_r8*o2(lev1-2,i)
     190           0 :        o1n(lev1)    = 1.5_r8*o1(lev1-1,i)-.5_r8*o1(lev1-2,i)
     191           0 :        n2n(lev1)    = 1.5_r8*n2(lev1-1,i)-.5_r8*n2(lev1-2,i)
     192           0 :        tn_int(lev1) = 1.5_r8*tn(lev1-1,i)-.5_r8*tn(lev1-2,i)
     193           0 :        barm_int(lev1) = 1.5_r8*barm(lev1-1,i)-.5_r8*barm(lev1-2,i)
     194             :        !
     195             :        ! N2:
     196           0 :        do k=lev0,lev1
     197           0 :           if (n2n(k) < 0._r8) n2n(k) = 0._r8
     198             :        enddo ! k=lev0,lev1
     199             : 
     200             :        !
     201             :        ! Convert o2,o,n2 to number density (interfaces):
     202             : 
     203           0 :        do k=lev0,lev1
     204             :           ! xnmbar at interfaces:
     205           0 :           xnmbar(k,i) = pint(k,i)*barm_int(k)/(boltz*tn_int(k)) ! s8
     206           0 :           o2n(k) = xnmbar(k,i)*o2n(k)*rmassinv_o2       ! s13
     207           0 :           o1n(k) = xnmbar(k,i)*o1n(k)*rmassinv_o1       ! s12
     208           0 :           n2n(k) = xnmbar(k,i)*n2n(k)*rmassinv_n2       ! s11
     209           0 :           root_te(k) = sqrt(te_int(k))
     210             :           !
     211             :           tek0(k) = 7.5e5_r8/ &
     212             :                (1._r8+3.22e4_r8*te_int(k)**2/ &
     213             :                ne(k,i)*(root_te(k)* &
     214             :                (2.82e-17_r8 - 3.41e-21_r8   * te_int (k))*n2n(k)+ &
     215             :                (2.20e-16_r8 + 7.92e-18_r8   * root_te(k))*o2n(k)+ &
     216           0 :                1.10e-16_r8 * (1._r8+5.7e-4_r8 * te_int (k))*o1n(k)))*evergs
     217             : 
     218             :        enddo ! k=lev0,lev1
     219             : 
     220           0 :        do k=lev0,lev1-1
     221           0 :           h_mid(k) = gask*tn(k,i)/(barm(k,i)*grav) ! s7
     222             :        enddo ! k=lev0,lev1-1
     223           0 :        do k=lev0,lev1
     224           0 :           h_int(k) = gask*tn_int(k)/(barm_int(k)*grav)              ! s6
     225             :        enddo ! k=lev0,lev1
     226             : 
     227           0 :        if (abs(dipmag(i)) >= dipmin) then
     228           0 :           sindipmag = (sin(dipmag(i)))**2 ! t2,s2
     229             :        else
     230             :           sindipmag = (sin(dipmin))**2
     231             :        endif
     232           0 :        if (sindipmag < .10_r8) sindipmag = .10_r8
     233             :        !
     234             :        ! Start coefficients and rhs for trsolv:
     235           0 :        do k=lev0,lev1-1
     236           0 :           p_coef(k,i) = 2._r8/7._r8*sindipmag/(h_mid(k)*dellnp(k)**2) ! s1
     237           0 :           r_coef(k,i) = p_coef(k,i)*tek0(k+1)/h_int(k+1)  ! s3
     238           0 :           p_coef(k,i) = p_coef(k,i)*tek0(k  )/h_int(k  )  ! s1
     239           0 :           q_coef(k,i) = -(p_coef(k,i)+r_coef(k,i))            ! s2
     240           0 :           rhs(k,i) = 0._r8                                       ! s4
     241             :        enddo ! k=lev0,lev1-1
     242             :        !
     243             :        ! Bottom boundary:
     244           0 :        q_coef(lev0,i) = q_coef(lev0,i)-p_coef(lev0,i)
     245           0 :        rhs(lev0,i) = rhs(lev0,i)-2._r8*p_coef(lev0,i)*tn_int(lev0)**3.5_r8
     246           0 :        p_coef(lev0,i) = 0._r8
     247             :        !
     248             :        ! Upper boundary:
     249           0 :        q_coef(lev1-1,i) = q_coef(lev1-1,i)+r_coef(lev1-1,i)
     250             :        rhs(lev1-1,i) = rhs(lev1-1,i)+r_coef(lev1-1,i)*dellnp(lev1-1)*3.5_r8* &
     251           0 :             h_int(lev1)*fe/tek0(lev1)
     252           0 :        r_coef(lev1-1,i) = 0._r8
     253             : 
     254             :        !
     255             :        !
     256             :        ! Set Ne (midpoints "(K+1/2)"):
     257             :        !
     258           0 :        do k=lev0,lev1-1
     259           0 :           root_ne(k) = ne(k,i)*ne(k+1,i)
     260           0 :           if (root_ne(k) < 1.e4_r8) root_ne(k) = 1.e4_r8
     261           0 :           root_ne(k) = sqrt(root_ne(k))
     262             :        enddo ! k=lev0,lev1-1
     263             : 
     264             :        !
     265             :        ! Set up o2,o,n2 number densities at midpoints:
     266             :        !
     267             : 
     268           0 :        do k=lev0,lev1-1
     269           0 :           xnmbar(k,i) = pmid(k,i)*barm(k,i)/(boltz*tn(k,i))
     270           0 :           o2n(k) = xnmbar(k,i)*o2(k,i)*rmassinv_o2  ! s14
     271           0 :           o1n(k) = xnmbar(k,i)*o1(k,i)*rmassinv_o1  ! s13
     272           0 :           n2n(k) = n2(k,i)
     273           0 :           if (n2n(k) < 0._r8) n2n(k) = 0._r8
     274           0 :           n2n(k) = xnmbar(k,i)*n2n(k)*rmassinv_n2 ! s12
     275             :           !
     276             :           ! Calculate source term qe (s10)
     277             :           ! Comment from earlier version (maybe the *1.0 below was once *2.0):
     278             :           !   "Correction facor of 2 increase in TE heating rate"
     279             :           !
     280           0 :           qe(k) = log(root_ne(k)/(o2n(k)+n2n(k)+0.1_r8*o1n(k)))
     281             :           qe(k) = exp(-((((0.001996_r8*qe(k)+0.08034_r8)*qe(k)+1.166_r8)* &
     282           0 :                qe(k)+6.941_r8)*qe(k)+12.75_r8))*1.0_r8
     283             :           !
     284             :           ! Subtract qe from right-hand-side:
     285           0 :           rhs(k,i) = rhs(k,i)-qe(k)*qtot(k,i)*evergs
     286           0 :           root_te(k) = sqrt(te(k,i))
     287             :           !
     288             :           ! Electron/N2 collision A(E,N2,VIB) (s9):
     289             :           !
     290           0 :           if (te(k,i) >= 1000._r8) then
     291           0 :              coll_en2v(k) = 2.e-7_r8*exp(-4605.2_r8/te(k,i))
     292             :           else
     293           0 :              coll_en2v(k) = 5.71e-8_r8*exp(-3352.6_r8/te(k,i))
     294             :           endif
     295           0 :           if (te(k,i) > 2000._r8) then
     296           0 :              coll_en2v(k) = 2.53e-6_r8*root_te(k)*exp(-17620._r8/te(k,i))
     297             :           end if
     298             :           !
     299             :           ! Loss due to electron/n2 collision L0(E,N2,VIB)/(NE*N(N2)) (s10)
     300             :           !
     301           0 :           loss_en2v(k) = 3200._r8*(1._r8/te(k,i)-1._r8/tn(k,i))
     302           0 :           loss_en2v(k) = sign(abs(loss_en2v(k))+del,loss_en2v(k)) ! avoid divide by zero in the next line when te = tn
     303             :                                                                   ! by adding a small value to loss_en2v
     304             :                                                                   ! this assumes te >= tn 
     305           0 :           loss_en2v(k) = -3200._r8/(te(k,i)*tn(k,i))*(1._r8-exp(loss_en2v(k)))/loss_en2v(k)
     306           0 :           loss_en2v(k) = 1.3e-4_r8*loss_en2v(k)*coll_en2v(k)
     307             :        enddo ! k=lev0,lev1-1
     308             : 
     309             :        !
     310             :        ! Calculate and sum cooling rates (heat loss) due to interactions between
     311             :        ! electrons/neutrals, electrons/ions, ions/neutrals
     312             :        !
     313           0 :        do k=lev0,lev1-1
     314             :           !
     315             :           ! Electron/N2 loss rate:
     316             :           ! loss_en2 = (L0(E,N2)+L0(E,N2,ROT)+L0(E,N2,VIB))/NE (s11)
     317             :           !
     318           0 :           loss_en2(k) = n2n(k)*(1.77E-19_r8*(1._r8-1.21E-4_r8*te(k,i))* te(k,i) + 2.9e-14_r8/root_te(k) + loss_en2v(k))
     319             :           !
     320             :           ! Start total of electron/neutral loss rate (s11):
     321             :           !
     322           0 :           loss_en(k) = loss_en2(k)
     323             :           !
     324             :           ! Electron/O2 loss rates: (L0(E,O2)+L0(E,O2,ROT)+L0(E,O2,VIB)/NE
     325             :           !
     326             :           loss_eo2(k) = o2n(k)*(1.21e-18_r8*(1._r8+3.6e-2_r8*root_te(k))* &
     327           0 :                root_te(k)+6.9e-14_r8/root_te(k)+3.125e-21_r8*te(k,i)**2)
     328           0 :           loss_en(k) = loss_en(k)+loss_eo2(k)
     329             :           !
     330             :           ! Electron/O(1d) loss rates: L0(E,O,1D)/(NE*N(O))
     331             :           !
     332           0 :           loss_eo1d(k) = 22713._r8*(1._r8/te(k,i)-1._r8/tn(k,i))
     333           0 :           loss_eo1d(k) = sign(abs(loss_eo1d(k))+del,loss_eo1d(k))
     334           0 :           loss_eo1d(k) = 22713._r8/(te(k,i)*tn(k,i))*(1._r8-exp(loss_eo1d(k)))/loss_eo1d(k)
     335             :           !
     336             :           ! loss_eo1d function often fails here with bad argument to exp()
     337             :           ! due to high te and/or high loss_eo1d from above.
     338             :           !         loss_eo1d(k) = 1.57e-12*exp((2.4e4+0.3*(te(k)-1500.)-
     339             :           !                        1.947e-5*(te(k)-1500.)*(te(k)-4000.))*(te(k)-3000.)/
     340             :           !                       (3000.*te(k)))*loss_eo1d(k)
     341           0 :           loss_eo1d(k) = 0._r8
     342             :           !
     343             :           ! Electron/O1 loss rates: (L0(E,O)+L0(E,O,F))/NE
     344             :           !
     345             :           loss_eo1(k) = o1n(k)*(7.9e-19_r8*(1._r8+5.7e-4_r8*te(k,i))* &
     346             :                root_te(k)+3.4e-12_r8*(1._r8-7.e-5_r8*te(k,i))/tn(k,i)* &
     347           0 :                (150._r8/te(k,i)+0.4_r8))
     348             : 
     349           0 :           loss_en(k) = loss_en(k)+loss_eo1(k)
     350             :           !
     351             :           ! loss_xen = L0*(E,N) (s8)
     352             :           !
     353             :           loss_xen(k) = (loss_en(k)+o1n(k)*(1._r8-alam/(ad+sd* &
     354           0 :                n2n(k)))*loss_eo1d(k))*root_ne(k)*evergs
     355             :           !
     356             :           ! Complete total electron/neutral loss rate L0(E,N) (s11):
     357             :           !
     358             :           loss_en(k) = (loss_en(k)+o1n(k)*loss_eo1d(k))* &
     359           0 :                root_ne(k)*evergs
     360             :           !
     361             :           ! Calculate L0(E) = L(E)/(TE-TI), where L(E) is loss due to
     362             :           ! interactions between electrons and ions.
     363             :           !
     364             :           loss_ei(k,i) = 3.2e-8_r8*root_ne(k)/(root_te(k)*te(k,i))* &
     365           0 :                15._r8*(op(k,i)+0.5_r8*o2p(k,i)+0.53_r8*nop(k,i))*evergs
     366             : 
     367           0 :           root_tn(k) = sqrt(tn(k,i))
     368             :           ! 
     369             :           ! loss_in = ion/neutral cooling = L0(I,N) =L(I,N)/(TI-TN)
     370             :           !
     371             :           loss_in(k,i) = ((6.6e-14_r8*n2n(k)+5.8e-14_r8*o2n(k)+0.21e-14_r8* &
     372             :                o1n(k)*root2*root_tn(k))*op(k,i)+(5.45e-14_r8*o2n(k)+ &
     373             :                5.9e-14_r8*n2n(k)+4.5e-14_r8*o1n(k))*nop(k,i)+(5.8e-14_r8* &
     374             :                n2n(k)+4.4e-14_r8*o1n(k)+0.14e-14_r8*o2n(k)*root_tn(k))* &
     375           0 :                o2p(k,i))*evergs
     376             :           !
     377             :           ! Complete tridiagonal matrix coefficients and rhs:
     378             :           !
     379             :           ! q_coef = q_coef-(L0(E,N)+L0(E,I))/TE**2.5 = Q
     380             :           !
     381           0 :           q_coef(k,i) = q_coef(k,i)-(loss_en(k)+loss_ei(k,i))/te(k,i)**2.5_r8
     382             :           !          
     383             :           ! rhs = rhs-L0(E,N)*TN-L0(E)*TI
     384             :           !
     385           0 :           rhs(k,i) = rhs(k,i)-loss_en(k)*tn(k,i)-loss_ei(k,i)*ti(k,i)
     386             : 
     387             :        enddo ! k=lev0,lev1-1
     388             : 
     389             :        ! Calculate heating due to electron/neutral and electron/ion collisions
     390             :        ! (ergs/sec/gm):
     391             :        !
     392           0 :        do k=lev0,lev1-1
     393           0 :           if (te(k,i)-ti(k,i) >= 0._r8) then
     394           0 :              q_eni(k)=loss_ei(k,i)*(te(k,i)-ti(k,i))
     395             :           else
     396           0 :              q_eni(k) = 0._r8
     397             :           endif
     398           0 :           q_eni(k) = (loss_xen(k)*(te(k,i)-tn(k,i))+q_eni(k)) * avo/xnmbar(k,i)
     399             :        enddo ! k=lev0,lev1-1
     400             : 
     401             :        !
     402             :        ! Add collisional heating to Q for use in thermodynamic equation.
     403           0 :        do k=lev0,lev1-2
     404           0 :           qtotal(k+1,i) = qtotal(k+1,i)+.5_r8*(q_eni(k)+q_eni(k+1))
     405             :        enddo ! k=lev0,lev1-2
     406             :        !
     407             :        ! Upper and lower boundaries:
     408           0 :        qtotal(lev0,i) = qtotal(lev0,i)+1.5_r8*q_eni(lev0)-0.5_r8*q_eni(lev0+1)
     409           0 :        qtotal(lev1,i) = qtotal(lev1,i)+1.5_r8*q_eni(lev1-1)-0.5_r8*q_eni(lev1-2)
     410             :     end do col_loop
     411             : 
     412             :     !
     413             :     ! Solve tridiagonal system:
     414             :     !
     415           0 :     call trsolv(p_coef,q_coef,r_coef,rhs,te_out,  lev0,lev1, lev0,lev1-1, 1,ncol )
     416             : 
     417           0 :     col_loop2: do i=1,ncol
     418             :        !
     419             :        ! Te = Te**(2./7.):
     420           0 :        do k=lev0,lev1-1
     421           0 :           te_out(k,i) = te_out(k,i)**(2._r8/7._r8)
     422             :        enddo
     423             :        !
     424             :        ! 10/21/03 btf: make this check after te*(2/7), rather than before.
     425             :        !
     426             :        ! Te must be >= Tn:
     427           0 :        do k=lev0,lev1-1
     428           0 :           if (te_out(k,i) < tn(k,i)) te_out(k,i) = tn(k,i)
     429             :        enddo
     430             :        !
     431             :        ! 1/9/08 btf: put spval in top level of te:
     432             :        !    te_out(lev1) = spval
     433           0 :        te_out(lev1,i) = te_out(lev1-1,i)
     434             :        !
     435             :        ! Set ion temperature output. Use joule heating qji_ti from sub 
     436             :        ! qjoule_ti (see qjoule.F). lev1 not calculated.
     437             :        !
     438           0 :        do k=lev0,lev1-1
     439           0 :           ti_out(k,i) = (qji_ti(k,i)*(xnmbar(k,i)/avo)+ &
     440             :                loss_ei(k,i)*te_out(k,i)+loss_in(k,i)*tn(k,i))/&
     441           0 :                (loss_ei(k,i)+loss_in(k,i))
     442             :           !
     443             :           ! ti must be at least as large as tn:
     444           0 :           if (ti_out(k,i) < tn(k,i)) ti_out(k,i) = tn(k,i)
     445             :        enddo
     446             :        !
     447             :        ! 1/9/08 btf: put spval in top level of ti:
     448             :        !    ti_out(lev1) = spval
     449           0 :        ti_out(lev1,i) = ti_out(lev1-1,i)
     450             :     end do col_loop2
     451             : 
     452           0 :   end subroutine settei
     453             : 
     454             : end module tei_mod
     455             : 

Generated by: LCOV version 1.14