7 !! Computation of temperature and age for a cold ice column.
 
   11 !! Copyright 2009-2013 Ralf Greve
 
   15 !! This file is part of SICOPOLIS.
 
   17 !! SICOPOLIS is free software: you can redistribute it and/or modify
 
   18 !! it under the terms of the GNU General Public License as published by
 
   19 !! the Free Software Foundation, either version 3 of the License, or
 
   20 !! (at your option) any later version.
 
   22 !! SICOPOLIS is distributed in the hope that it will be useful,
 
   23 !! but WITHOUT ANY WARRANTY; without even the implied warranty of
 
   24 !! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
   25 !! GNU General Public License for more details.
 
   27 !! You should have received a copy of the GNU General Public License
 
   28 !! along with SICOPOLIS.  If not, see <http://www.gnu.org/licenses/>.
 
   30 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
   33 !> Computation of temperature and age for a cold ice column.
 
   34 !<------------------------------------------------------------------------------
 
   36    at4_1, at4_2, at5, at6, at7, atr1, acb1, acb2, &
 
   37    acb3, acb4, alb1, ai1, ai2, ai4, &
 
   39    dtime_temp, dtt_2dxi, dtt_2deta, i, j)
 
   45 integer(i4b) :: i, j, kc, kt, kr
 
   46 real(dp) :: at1(0:kcmax), at2_1(0:kcmax), at2_2(0:kcmax), &
 
   47             at3_1(0:kcmax), at3_2(0:kcmax), at4_1(0:kcmax), &
 
   48             at4_2(0:kcmax), at5(0:kcmax), at6(0:kcmax), at7, &
 
   49             ai1(0:kcmax), ai2(0:kcmax), ai4, &
 
   50             atr1, acb1, acb2, acb3, acb4, alb1
 
   51 real(dp) :: ct1(0:kcmax), ct2(0:kcmax), ct3(0:kcmax), ct4(0:kcmax), &
 
   52             ct5(0:kcmax), ct6(0:kcmax), ct7(0:kcmax), ctr1, &
 
   53             ccb1, ccb2, ccb3, ccb4, clb1
 
   54 real(dp) :: ct1_sg(0:kcmax), ct2_sg(0:kcmax), ct3_sg(0:kcmax), &
 
   55             ct4_sg(0:kcmax), adv_vert_sg(0:kcmax), abs_adv_vert_sg(0:kcmax)
 
   56 real(dp) :: ci1(0:kcmax), ci2(0:kcmax)
 
   57 real(dp) :: ftx_c_l(0:kcmax), ftx_c_r(0:kcmax), &
 
   58             fty_c_l(0:kcmax), fty_c_r(0:kcmax), &
 
   59             fax_c_l(0:kcmax), fax_c_r(0:kcmax), &
 
   60             fay_c_l(0:kcmax), fay_c_r(0:kcmax)
 
   61 real(dp) :: temp_c_help(0:kcmax)
 
   62 real(dp) :: mean_accum_inv
 
   63 real(dp) :: dtt_2dxi, dtt_2deta, dtime_temp
 
   64 real(dp) :: dtt_dxi, dtt_deta
 
   66 real(dp) :: lgs_a0(0:kcmax+ktmax+krmax+imax+jmax), &
 
   67             lgs_a1(0:kcmax+ktmax+krmax+imax+jmax), &
 
   68             lgs_a2(0:kcmax+ktmax+krmax+imax+jmax), &
 
   69             lgs_x(0:kcmax+ktmax+krmax+imax+jmax), &
 
   70             lgs_b(0:kcmax+ktmax+krmax+imax+jmax)
 
   71 real(dp), 
parameter :: zero=0.0_dp
 
   75 if ((i.eq.0).or.(i.eq.imax).or.(j.eq.0).or.(j.eq.jmax)) &
 
   76    stop 
' calc_temp1: Boundary points not allowed.' 
   86 ccb3 = acb3*0.5_dp*(vx_t(0,j,i)+vx_t(0,j,i-1)) &
 
   87        *h_c(j,i)*dzs_dxi_g(j,i)
 
   88 ccb4 = acb4*0.5_dp*(vy_t(0,j,i)+vy_t(0,j-1,i)) &
 
   89        *h_c(j,i)*dzs_deta_g(j,i)
 
   91 clb1 = alb1*q_geo(j,i)
 
   96    ct1(kc) = at1(kc)/h_c(j,i)*0.5_dp*(vz_c(kc,j,i)+vz_c(kc-1,j,i))
 
   99 #elif (ADV_VERT==2 || ADV_VERT==3) 
  102    ct1_sg(kc) = 0.5_dp*(at1(kc)+at1(kc+1))/h_c(j,i)*vz_c(kc,j,i)
 
  109    ct2(kc) = ( at2_1(kc)*dzm_dtau(j,i) &
 
  110            +at2_2(kc)*dh_c_dtau(j,i) )/h_c(j,i)
 
  111    ct3(kc) = ( at3_1(kc)*dzm_dxi_g(j,i) &
 
  112            +at3_2(kc)*dh_c_dxi_g(j,i) )/h_c(j,i) &
 
  113           *0.5_dp*(vx_c(kc,j,i)+vx_c(kc,j,i-1)) *insq_g11_g(j,i) 
 
  114    ct4(kc) = ( at4_1(kc)*dzm_deta_g(j,i) &
 
  115             +at4_2(kc)*dh_c_deta_g(j,i) )/h_c(j,i) &
 
  116           *0.5_dp*(vy_c(kc,j,i)+vy_c(kc,j-1,i)) *insq_g22_g(j,i) 
 
  118              /
c_val(temp_c(kc,j,i)) &
 
  121              /
c_val(temp_c(kc,j,i)) &
 
  123              *
ratefac(temp_c(kc,j,i), temp_c_m(kc,j,i)) &
 
  124              *
creep(sigma_c(kc,j,i)) &
 
  125              *sigma_c(kc,j,i)*sigma_c(kc,j,i)
 
  126    ci1(kc) = ai1(kc)/h_c(j,i)
 
  131    if (vx_c(kc,j,i-1).ge.zero) 
then 
  132       ftx_c_l(kc) = temp_c(kc,j,i-1)*vx_c(kc,j,i-1)
 
  133       fax_c_l(kc) =  age_c(kc,j,i-1)*vx_c(kc,j,i-1)
 
  135       ftx_c_l(kc) = temp_c(kc,j,i)*vx_c(kc,j,i-1)
 
  136       fax_c_l(kc) =  age_c(kc,j,i)*vx_c(kc,j,i-1)
 
  139    if (vx_c(kc,j,i).ge.zero) 
then 
  140       ftx_c_r(kc) = temp_c(kc,j,i)*vx_c(kc,j,i)
 
  141       fax_c_r(kc) =  age_c(kc,j,i)*vx_c(kc,j,i)
 
  143       ftx_c_r(kc) = temp_c(kc,j,i+1)*vx_c(kc,j,i)
 
  144       fax_c_r(kc) =  age_c(kc,j,i+1)*vx_c(kc,j,i)
 
  147    if (vy_c(kc,j-1,i).ge.zero) 
then 
  148       fty_c_l(kc) = temp_c(kc,j-1,i)*vy_c(kc,j-1,i)
 
  149       fay_c_l(kc) =  age_c(kc,j-1,i)*vy_c(kc,j-1,i)
 
  151       fty_c_l(kc) = temp_c(kc,j,i)*vy_c(kc,j-1,i)
 
  152       fay_c_l(kc) =  age_c(kc,j,i)*vy_c(kc,j-1,i)
 
  155    if (vy_c(kc,j,i).ge.zero) 
then 
  156       fty_c_r(kc) = temp_c(kc,j,i)*vy_c(kc,j,i)
 
  157       fay_c_r(kc) =  age_c(kc,j,i)*vy_c(kc,j,i)
 
  159       fty_c_r(kc) = temp_c(kc,j+1,i)*vy_c(kc,j,i)
 
  160       fay_c_r(kc) =  age_c(kc,j+1,i)*vy_c(kc,j,i)
 
  166 #if (ADV_VERT==2 || ADV_VERT==3) 
  169    ct2_sg(kc) = 0.5_dp*(ct2(kc)+ct2(kc+1))
 
  170    ct3_sg(kc) = 0.5_dp*(ct3(kc)+ct3(kc+1))
 
  171    ct4_sg(kc) = 0.5_dp*(ct4(kc)+ct4(kc+1))
 
  172    adv_vert_sg(kc) = ct1_sg(kc)-ct2_sg(kc)-ct3_sg(kc)-ct4_sg(kc)
 
  173    abs_adv_vert_sg(kc) = abs(adv_vert_sg(kc))
 
  179    temp_c_help(kc) = 0.5_dp*(temp_c(kc,j,i)+temp_c(kc+1,j,i))
 
  183    ci2(kc) = ai2(kc)/h_c(j,i)
 
  187 dtt_dxi  = 2.0_dp*dtt_2dxi
 
  188 dtt_deta = 2.0_dp*dtt_2deta
 
  204    lgs_a1(kr) = 1.0_dp + 2.0_dp*ctr1
 
  206    lgs_b(kr)    = temp_r(kr,j,i)
 
  216    lgs_b(kr)  = 2.0_dp*clb1
 
  224 lgs_a1(kr) = -(ccb1+ccb2)
 
  226 lgs_b(kr)  = ccb3+ccb4
 
  232    lgs_a0(krmax+kc) = -0.5_dp*(ct1(kc)-ct2(kc)-ct3(kc)-ct4(kc)) &
 
  234    lgs_a1(krmax+kc) = 1.0_dp+ct5(kc)*(ct6(kc)+ct6(kc-1))
 
  235    lgs_a2(krmax+kc) = 0.5_dp*(ct1(kc)-ct2(kc)-ct3(kc)-ct4(kc)) &
 
  238 #elif (ADV_VERT==2 || ADV_VERT==3) 
  241          = -0.5_dp*(adv_vert_sg(kc-1)+abs_adv_vert_sg(kc-1)) &
 
  245            +0.5_dp*(adv_vert_sg(kc-1)+abs_adv_vert_sg(kc-1)) &
 
  246            -0.5_dp*(adv_vert_sg(kc)  -abs_adv_vert_sg(kc)  ) &
 
  247            +ct5(kc)*(ct6(kc)+ct6(kc-1))
 
  249          =  0.5_dp*(adv_vert_sg(kc)  -abs_adv_vert_sg(kc)  ) &
 
  254 #if (ADV_HOR==2 || ADV_HOR==3) 
  256    lgs_b(krmax+kc) = temp_c(kc,j,i) + ct7(kc) &
 
  258           ( (vx_c(kc,j,i)-abs(vx_c(kc,j,i))) &
 
  259             *(temp_c(kc,j,i+1)-temp_c(kc,j,i)) &
 
  261            +(vx_c(kc,j,i-1)+abs(vx_c(kc,j,i-1))) &
 
  262             *(temp_c(kc,j,i)-temp_c(kc,j,i-1)) &
 
  263             *insq_g11_sgx(j,i-1) ) &
 
  265           ( (vy_c(kc,j,i)-abs(vy_c(kc,j,i))) &
 
  266             *(temp_c(kc,j+1,i)-temp_c(kc,j,i)) &
 
  268            +(vy_c(kc,j-1,i)+abs(vy_c(kc,j-1,i))) &
 
  269             *(temp_c(kc,j,i)-temp_c(kc,j-1,i)) &
 
  270             *insq_g22_sgy(j-1,i) )
 
  274    lgs_b(krmax+kc) = temp_c(kc,j,i) + ct7(kc) &
 
  275                      -dtt_dxi *(ftx_c_r(kc)-ftx_c_l(kc)) &
 
  276                      -dtt_deta*(fty_c_r(kc)-fty_c_l(kc))
 
  283 lgs_a0(krmax+kc) = 0.0_dp
 
  284 lgs_a1(krmax+kc) = 1.0_dp
 
  285 lgs_b(krmax+kc)  = temp_s(j,i)
 
  289 call 
tri_sle(lgs_a0, lgs_a1, lgs_a2, lgs_x, lgs_b, kcmax+krmax)
 
  294    temp_r_neu(kr,j,i) = lgs_x(kr)
 
  298    temp_c_neu(kc,j,i) = lgs_x(krmax+kc)
 
  305    omega_t_neu(kt,j,i) = 0.0_dp
 
  314 #if (ADV_HOR==3 && ADV_VERT==3) 
  325 lgs_b(kc)  = m_age*h_c(j,i)*ai4*mean_accum_inv
 
  330 lgs_a1(kc) = 1.0_dp - adv_vert_sg(kc)
 
  331 lgs_a2(kc) = adv_vert_sg(kc)
 
  332 lgs_b(kc) = age_c(kc,j,i) + dtime_temp &
 
  334           ( (vx_c(kc,j,i)-abs(vx_c(kc,j,i))) &
 
  335             *(age_c(kc,j,i+1)-age_c(kc,j,i)) &
 
  337            +(vx_c(kc,j,i-1)+abs(vx_c(kc,j,i-1))) &
 
  338             *(age_c(kc,j,i)-age_c(kc,j,i-1)) &
 
  339             *insq_g11_sgx(j,i-1) ) &
 
  341           ( (vy_c(kc,j,i)-abs(vy_c(kc,j,i))) &
 
  342             *(age_c(kc,j+1,i)-age_c(kc,j,i)) &
 
  344            +(vy_c(kc,j-1,i)+abs(vy_c(kc,j-1,i))) &
 
  345             *(age_c(kc,j,i)-age_c(kc,j-1,i)) &
 
  346             *insq_g22_sgy(j-1,i) )
 
  354    lgs_a0(kc) = -0.5_dp*(ct1(kc)-ct2(kc)-ct3(kc)-ct4(kc)) &
 
  356    lgs_a1(kc) = 1.0_dp+ci1(kc)*(ci2(kc)+ci2(kc-1))
 
  357    lgs_a2(kc) = 0.5_dp*(ct1(kc)-ct2(kc)-ct3(kc)-ct4(kc)) &
 
  362    lgs_a0(kc) = -0.5_dp*(adv_vert_sg(kc-1)+abs_adv_vert_sg(kc-1))
 
  363    lgs_a1(kc) =  1.0_dp &
 
  364                 +0.5_dp*(adv_vert_sg(kc-1)+abs_adv_vert_sg(kc-1)) &
 
  365                 -0.5_dp*(adv_vert_sg(kc)  -abs_adv_vert_sg(kc)  )
 
  366    lgs_a2(kc) =  0.5_dp*(adv_vert_sg(kc)  -abs_adv_vert_sg(kc)  )
 
  372    lgs_b(kc) = age_c(kc,j,i) + dtime_temp &
 
  374           ( (vx_c(kc,j,i)-abs(vx_c(kc,j,i))) &
 
  375             *(age_c(kc,j,i+1)-age_c(kc,j,i)) &
 
  377            +(vx_c(kc,j,i-1)+abs(vx_c(kc,j,i-1))) &
 
  378             *(age_c(kc,j,i)-age_c(kc,j,i-1)) &
 
  379             *insq_g11_sgx(j,i-1) ) &
 
  381           ( (vy_c(kc,j,i)-abs(vy_c(kc,j,i))) &
 
  382             *(age_c(kc,j+1,i)-age_c(kc,j,i)) &
 
  384            +(vy_c(kc,j-1,i)+abs(vy_c(kc,j-1,i))) &
 
  385             *(age_c(kc,j,i)-age_c(kc,j-1,i)) &
 
  386             *insq_g22_sgy(j-1,i) )
 
  390    lgs_b(kc) = age_c(kc,j,i) + dtime_temp &
 
  391                -dtt_dxi *(fax_c_r(kc)-fax_c_l(kc)) &
 
  392                -dtt_deta*(fay_c_r(kc)-fay_c_l(kc))
 
  401 if (as_perp(j,i).ge.zero) 
then 
  414 if (as_perp(j,i).ge.zero) 
then 
  419    lgs_a0(kc) = -adv_vert_sg(kc-1)
 
  420    lgs_a1(kc) = 1.0_dp + adv_vert_sg(kc-1)
 
  421    lgs_b(kc) = age_c(kc,j,i) + dtime_temp &
 
  423           ( (vx_c(kc,j,i)-abs(vx_c(kc,j,i))) &
 
  424             *(age_c(kc,j,i+1)-age_c(kc,j,i)) &
 
  426            +(vx_c(kc,j,i-1)+abs(vx_c(kc,j,i-1))) &
 
  427             *(age_c(kc,j,i)-age_c(kc,j,i-1)) &
 
  428             *insq_g11_sgx(j,i-1) ) &
 
  430           ( (vy_c(kc,j,i)-abs(vy_c(kc,j,i))) &
 
  431             *(age_c(kc,j+1,i)-age_c(kc,j,i)) &
 
  433            +(vy_c(kc,j-1,i)+abs(vy_c(kc,j-1,i))) &
 
  434             *(age_c(kc,j,i)-age_c(kc,j-1,i)) &
 
  435             *insq_g22_sgy(j-1,i) )
 
  443 call 
tri_sle(lgs_a0, lgs_a1, lgs_a2, lgs_x, lgs_b, kcmax)
 
  450    age_c_neu(kc,j,i) = lgs_x(kc)
 
  452    if (age_c_neu(kc,j,i).lt.(age_min*year_sec)) &
 
  453                             age_c_neu(kc,j,i) = 0.0_dp
 
  454    if (age_c_neu(kc,j,i).gt.(age_max*year_sec)) &
 
  455                             age_c_neu(kc,j,i) = age_max*year_sec
 
  462    age_t_neu(kt,j,i) = age_c_neu(0,j,i)