7 !! Computation of the surface temperature (must be less than 0 deg C!)
8 !! and of the accumulation-ablation function.
12 !! Copyright 2009-2013 Ralf Greve
16 !! This file is part of SICOPOLIS.
18 !! SICOPOLIS is free software: you can redistribute it and/or modify
19 !! it under the terms of the GNU General Public License as published by
20 !! the Free Software Foundation, either version 3 of the License, or
21 !! (at your option) any later version.
23 !! SICOPOLIS is distributed in the hope that it will be useful,
24 !! but WITHOUT ANY WARRANTY; without even the implied warranty of
25 !! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 !! GNU General Public License for more details.
28 !! You should have received a copy of the GNU General Public License
29 !! along with SICOPOLIS. If not, see <http://www.gnu.org/licenses/>.
31 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
34 !> Computation of the surface temperature (must be less than 0 deg C!)
35 !! and of the accumulation-ablation function.
36 !<------------------------------------------------------------------------------
38 delta_ts, glac_index, z_sl, dzsl_dtau, z_mar)
45 real(dp),
intent(in) :: time, dtime, dxi, deta
47 real(dp),
intent(out) :: delta_ts, glac_index, dzsl_dtau, z_mar
48 real(dp),
intent(inout) :: z_sl
56 integer(i4b) :: i, j, n
57 integer(i4b) :: i_gr, i_kl
59 real(dp) :: z_sl_min, t1, t2, t3, t4, t5, t6
60 real(dp) :: time_gr, time_kl
61 real(dp) :: z_sle_present, z_sle_help
62 real(dp),
dimension(0:JMAX,0:IMAX,0:12) :: precip
63 real(dp),
dimension(0:JMAX,0:IMAX) :: &
64 snowfall, rainfall, melt, melt_star
65 real(dp),
dimension(0:JMAX,0:IMAX,12) :: temp_mm
66 real(dp),
dimension(0:JMAX,0:IMAX) :: temp_ma
67 real(dp),
dimension(12) :: temp_mm_help
68 real(dp) :: temp_jja_help
69 real(dp),
dimension(0:JMAX,0:IMAX) :: et
70 real(dp) :: gamma_t, temp_diff
71 real(dp) :: gamma_p, zs_thresh, &
72 temp_rain, temp_snow, &
73 inv_delta_temp_rain_snow, coeff(0:5), inv_sqrt2_s_stat, &
74 precip_fact, frac_solid
75 real(dp) :: s_stat, beta1, beta2, pmax, mu, lambda_lti, temp_lti
77 logical,
dimension(0:JMAX,0:IMAX) :: check_point
79 real(dp),
parameter :: &
80 inv_twelve = 1.0_dp/12.0_dp, one_third = 1.0_dp/3.0_dp
99 delta_ts = sine_amplit &
100 *cos(2.0_dp*pi*time/(sine_period*year_sec)) &
107 if (time/year_sec.lt.
real(grip_time_min,dp)) then
108 delta_ts = griptemp(0)
109 else if (time/year_sec.lt.
real(grip_time_max,dp)) then
111 i_kl = floor(((time/year_sec) &
112 -
real(grip_time_min,dp))/
real(grip_time_stp,dp))
115 i_gr = ceiling(((time/year_sec) &
116 -
real(grip_time_min,dp))/
real(grip_time_stp,dp))
117 i_gr = min(i_gr, ndata_grip)
119 if (i_kl.eq.i_gr)
then
121 delta_ts = griptemp(i_kl)
125 time_kl = (grip_time_min + i_kl*grip_time_stp) *year_sec
126 time_gr = (grip_time_min + i_gr*grip_time_stp) *year_sec
128 delta_ts = griptemp(i_kl) &
129 +(griptemp(i_gr)-griptemp(i_kl)) &
130 *(time-time_kl)/(time_gr-time_kl)
136 delta_ts = griptemp(ndata_grip)
139 delta_ts = delta_ts * grip_temp_fact
146 if (time/year_sec <
real(gi_time_min,dp)) then
147 glac_index = glacial_index(0)
148 else if (time/year_sec <
real(gi_time_max,dp)) then
150 i_kl = floor(((time/year_sec) &
151 -
real(gi_time_min,dp))/
real(gi_time_stp,dp))
154 i_gr = ceiling(((time/year_sec) &
155 -
real(gi_time_min,dp))/
real(gi_time_stp,dp))
156 i_gr = min(i_gr, ndata_gi)
158 if (i_kl == i_gr)
then
160 glac_index = glacial_index(i_kl)
164 time_kl = (gi_time_min + i_kl*gi_time_stp) *year_sec
165 time_gr = (gi_time_min + i_gr*gi_time_stp) *year_sec
167 glac_index = glacial_index(i_kl) &
168 +(glacial_index(i_gr)-glacial_index(i_kl)) &
169 *(time-time_kl)/(time_gr-time_kl)
175 glac_index = glacial_index(ndata_gi)
191 t1 = -250000.0_dp *year_sec
192 t2 = -140000.0_dp *year_sec
193 t3 = -125000.0_dp *year_sec
194 t4 = -21000.0_dp *year_sec
195 t5 = -8000.0_dp *year_sec
196 t6 = 0.0_dp *year_sec
200 else if (time.lt.t2)
then
201 z_sl = z_sl_min*(time-t1)/(t2-t1)
202 else if (time.lt.t3)
then
203 z_sl = -z_sl_min*(time-t3)/(t3-t2)
204 else if (time.lt.t4)
then
205 z_sl = z_sl_min*(time-t3)/(t4-t3)
206 else if (time.lt.t5)
then
207 z_sl = -z_sl_min*(time-t5)/(t5-t4)
208 else if (time.lt.t6)
then
218 if (time/year_sec.lt.
real(specmap_time_min,dp)) then
219 z_sl = specmap_zsl(0)
220 else if (time/year_sec.lt.
real(specmap_time_max,dp)) then
222 i_kl = floor(((time/year_sec) &
223 -
real(specmap_time_min,dp))/
real(specmap_time_stp,dp))
226 i_gr = ceiling(((time/year_sec) &
227 -
real(specmap_time_min,dp))/
real(specmap_time_stp,dp))
228 i_gr = min(i_gr, ndata_specmap)
230 if (i_kl.eq.i_gr)
then
232 z_sl = specmap_zsl(i_kl)
236 time_kl = (specmap_time_min + i_kl*specmap_time_stp) *year_sec
237 time_gr = (specmap_time_min + i_gr*specmap_time_stp) *year_sec
239 z_sl = specmap_zsl(i_kl) &
240 +(specmap_zsl(i_gr)-specmap_zsl(i_kl)) &
241 *(time-time_kl)/(time_gr-time_kl)
247 z_sl = specmap_zsl(ndata_specmap)
254 if ( z_sl_old > -999999.9_dp )
then
255 dzsl_dtau = (z_sl-z_sl_old)/dtime
264 #if ( MARINE_ICE_CALVING==2 || MARINE_ICE_CALVING==3 )
266 #elif ( MARINE_ICE_CALVING==4 || MARINE_ICE_CALVING==5 )
267 z_mar = fact_z_mar*z_sl
268 #elif ( MARINE_ICE_CALVING==6 || MARINE_ICE_CALVING==7 )
269 if (z_sl >= -80.0_dp)
then
272 z_mar = 10.25_dp*(z_sl+80.0_dp)-200.0_dp
274 z_mar = fact_z_mar*z_mar
286 check_point(j,i) = .false.
292 if (maske(j,i).ge.2)
then
293 check_point(j ,i ) = .true.
294 check_point(j ,i+1) = .true.
295 check_point(j ,i-1) = .true.
296 check_point(j+1,i ) = .true.
297 check_point(j-1,i ) = .true.
304 if (check_point(j,i))
then
314 if (check_point(j,i))
then
315 maske(j,i) = maske_neu(j,i)
322 gamma_t = -6.5e-03_dp
332 temp_diff = gamma_t*(zs(j,i)-zs_ref(j,i)) + delta_ts
335 temp_mm(j,i,n) = temp_mm_present(j,i,n) + temp_diff
338 #elif (TSURFACE == 5)
343 temp_diff = gamma_t*(zs(j,i)-zs_ref(j,i))
346 temp_mm(j,i,n) = temp_mm_present(j,i,n) &
347 + glac_index*temp_mm_lgm_anom(j,i,n) &
355 temp_ma(j,i) = 0.0_dp
358 temp_ma(j,i) = temp_ma(j,i) + temp_mm(j,i,n)*inv_twelve
366 #if (ELEV_DESERT == 1)
368 gamma_p = gamma_p*1.0e-03_dp
370 zs_thresh = zs_thresh
374 #if (SOLID_PRECIP == 1) /* Marsiat (1994) */
381 inv_delta_temp_rain_snow = 1.0_dp/(temp_rain-temp_snow)
383 #elif (SOLID_PRECIP == 2) /* Bales et al. (2009) */
390 coeff(0) = 5.4714e-01_dp
391 coeff(1) = -9.1603e-02_dp
392 coeff(2) = -3.314e-03_dp
393 coeff(3) = 4.66e-04_dp
394 coeff(4) = 3.8e-05_dp
395 coeff(5) = 6.0e-07_dp
397 #elif (SOLID_PRECIP == 3) /* Huybrechts and de Wolde (1999) */
401 temp_snow = temp_rain
407 inv_sqrt2_s_stat = 1.0_dp/(sqrt(2.0_dp)*s_stat)
411 #if (ABLSURFACE==1 || ABLSURFACE==2)
414 beta1 = beta1_0 *(0.001_dp/86400.0_dp)*(rho_w/rho)
416 beta2 = beta2_0 *(0.001_dp/86400.0_dp)*(rho_w/rho)
419 mu = mu_0 *(1000.0_dp*86400.0_dp)*(rho/rho_w)
422 #elif (ABLSURFACE==3)
424 lambda_lti = lambda_lti *(0.001_dp/year_sec)*(rho_w/rho)
436 #if (ACCSURFACE <= 3)
440 #if (ELEV_DESERT == 0)
444 #elif (ELEV_DESERT == 1)
446 if (zs_ref(j,i) < zs_thresh)
then
448 = exp(gamma_p*(max(zs(j,i),zs_thresh)-zs_thresh))
451 = exp(gamma_p*(max(zs(j,i),zs_thresh)-zs_ref(j,i)))
455 stop
' boundary: Parameter ELEV_DESERT must be either 0 or 1!'
459 precip(j,i,n) = precip_present(j,i,n)*precip_fact
467 precip_fact = accfact
469 precip_fact = 1.0_dp + gamma_s*delta_ts
471 precip_fact = exp(gamma_s*delta_ts)
474 #if (ACCSURFACE <= 3)
476 precip(j,i,0) = 0.0_dp
479 precip(j,i,n) = precip(j,i,n)*precip_fact
480 precip(j,i,0) = precip(j,i,0) + precip(j,i,n)*inv_twelve
484 #elif (ACCSURFACE == 5)
486 precip(j,i,0) = 0.0_dp
490 #if (PRECIP_ANOM_INTERPOL==1)
491 precip_fact = 1.0_dp-glac_index+glac_index*precip_lgm_anom(j,i,n)
493 #elif (PRECIP_ANOM_INTERPOL==2)
494 precip_fact = exp(-glac_index*gamma_precip_lgm_anom(j,i,n))
498 precip(j,i,n) = precip_present(j,i,n)*precip_fact
499 precip(j,i,0) = precip(j,i,0) + precip(j,i,n)*inv_twelve
507 accum(j,i) = precip(j,i,0)
509 snowfall(j,i) = 0.0_dp
513 #if (SOLID_PRECIP == 1) /* Marsiat (1994) */
515 if (temp_mm(j,i,n) >= temp_rain)
then
517 else if (temp_mm(j,i,n) <= temp_snow)
then
520 frac_solid = (temp_rain-temp_mm(j,i,n))*inv_delta_temp_rain_snow
523 #elif (SOLID_PRECIP == 2) /* Bales et al. (2009) */
525 if (temp_mm(j,i,n) >= temp_rain)
then
527 else if (temp_mm(j,i,n) <= temp_snow)
then
530 frac_solid = coeff(0) + temp_mm(j,i,n) * ( coeff(1) &
531 + temp_mm(j,i,n) * ( coeff(2) &
532 + temp_mm(j,i,n) * ( coeff(3) &
533 + temp_mm(j,i,n) * ( coeff(4) &
534 + temp_mm(j,i,n) * coeff(5) ) ) ) )
538 #elif (SOLID_PRECIP == 3) /* Huybrechts and de Wolde (1999) */
540 frac_solid = 1.0_dp &
541 - 0.5_dp*
erfcc((temp_rain-temp_mm(j,i,n))*inv_sqrt2_s_stat)
545 snowfall(j,i) = snowfall(j,i) + precip(j,i,n)*frac_solid*inv_twelve
549 rainfall(j,i) = precip(j,i,0) - snowfall(j,i)
551 if (snowfall(j,i) < 0.0_dp) snowfall(j,i) = 0.0_dp
552 if (rainfall(j,i) < 0.0_dp) rainfall(j,i) = 0.0_dp
558 #if (ABLSURFACE==1 || ABLSURFACE==2)
563 temp_mm_help(n) = temp_mm(j,i,n)
566 call
pdd(temp_mm_help, s_stat, et(j,i))
573 if ((beta1*et(j,i)) <= (pmax*snowfall(j,i)))
then
574 melt_star(j,i) = beta1*et(j,i)
576 runoff(j,i) = melt(j,i)+rainfall(j,i)
578 melt_star(j,i) = pmax*snowfall(j,i)
579 melt(j,i) = beta2*(et(j,i)-melt_star(j,i)/beta1)
580 runoff(j,i) = melt(j,i)+rainfall(j,i)
583 #elif (ABLSURFACE==2)
585 if ( rainfall(j,i) <= (pmax*snowfall(j,i)) )
then
587 if ( (rainfall(j,i)+beta1*et(j,i)) <= (pmax*snowfall(j,i)) )
then
588 melt_star(j,i) = rainfall(j,i)+beta1*et(j,i)
590 runoff(j,i) = melt(j,i)
592 melt_star(j,i) = pmax*snowfall(j,i)
594 *(et(j,i)-(melt_star(j,i)-rainfall(j,i))/beta1)
595 runoff(j,i) = melt(j,i)
600 melt_star(j,i) = pmax*snowfall(j,i)
601 melt(j,i) = beta2*et(j,i)
602 runoff(j,i) = melt(j,i) + rainfall(j,i)-pmax*snowfall(j,i)
608 #elif (ABLSURFACE==3)
610 temp_jja_help = one_third*(temp_mm(j,i,6)+temp_mm(j,i,7)+temp_mm(j,i,8))
612 melt_star(j,i) = 0.0_dp
613 melt(j,i) = lambda_lti*max((temp_jja_help-temp_lti), 0.0_dp)
614 runoff(j,i) = melt(j,i) + rainfall(j,i)
624 as_perp(j,i) = accum(j,i) - evap(j,i) - runoff(j,i)
630 if (melt_star(j,i).ge.melt(j,i))
then
631 temp_s(j,i) = temp_ma(j,i) &
632 +mu*(melt_star(j,i)-melt(j,i))
634 temp_s(j,i) = temp_ma(j,i)
637 if (temp_s(j,i) > -0.001_dp) temp_s(j,i) = -0.001_dp