My Project
ice_mechred.f90
Go to the documentation of this file.
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 !/===========================================================================/
13 ! CVS VERSION INFORMATION
14 ! $Id$
15 ! $Name$
16 ! $Revision$
17 !/===========================================================================/
18 
19 !=======================================================================
20 !BOP
21 !
22 ! !MODULE: ice_mechred - mechanical redestribution and ice strength
23 !
24 ! !DESCRIPTION:
25 !
26 ! Ice mechanical redistribution (ridging) and strength computations
27 !
28 ! See these references:
29 !
30 ! Flato, G. M., and W. D. Hibler III, 1995: Ridging and strength
31 ! in modeling the thickness distribution of Arctic sea ice,
32 ! J. Geophys. Res., 100, 18,611-18,626.
33 !
34 ! Hibler, W. D. III, 1980: Modeling a variable thickness sea ice
35 ! cover, Mon. Wea. Rev., 108, 1943-1973, 1980.
36 !
37 ! Lipscomb, W. H., E. C. Hunke, W. Maslowski, and J. Jakacki, 2006:
38 ! Ridging, strength, and stability in sea ice models, submitted
39 ! to J. Geophys. Res.
40 !
41 ! Rothrock, D. A., 1975: The energetics of the plastic deformation of
42 ! pack ice by ridging, J. Geophys. Res., 80, 4514-4519.
43 !
44 ! Thorndike, A. S., D. A. Rothrock, G. A. Maykut, and R. Colony,
45 ! 1975: The thickness distribution of sea ice, J. Geophys. Res.,
46 ! 80, 4501-4513.
47 !
48 ! !REVISION HISTORY:
49 !
50 ! authors William H. Lipscomb, LANL
51 ! Elizabeth C. Hunke (LANL)
52 !
53 ! 2004: Vectorized by Clifford Chen (Fujitsu) and William Lipscomb
54 ! 2006: New options for participation and redistribution (WHL)
55 !
56 ! !INTERFACE:
57 !
58  module ice_mechred
59 !
60 ! !USES:
61 !
62  use ice_model_size
63  use ice_constants
64  use ice_state
65  use ice_itd
66  use ice_grid
67  use ice_fileunits
68  use ice_domain
69  use ice_calendar, only: istep1, dyn_dt
70  use ice_work, only: worka
71 !
72 !EOP
73 !
74  implicit none
75  save
76 
77 !-----------------------------------------------------------------------
78 ! Ridging parameters
79 !-----------------------------------------------------------------------
80 
81  integer (kind=int_kind) :: & ! defined in namelist
82  kstrength & ! 0 for simple Hibler (1979) formulation
83  ! 1 for Rothrock (1975) pressure formulation
84  , krdg_partic & ! 0 for Thorndike et al. (1975) formulation
85  ! 1 for exponential participation function
86  , krdg_redist ! 0 for Hibler (1980) formulation
87  ! 1 for exponential redistribution function
88 
89  real (kind=dbl_kind), parameter :: &
90  cf = 17._dbl_kind & ! ratio of ridging work to PE change in ridging
91  , cs = p25 & ! fraction of shear energy contrbtng to ridging
92  , cp = p5*gravit*(rhow-rhoi)*rhoi/rhow &! proport const for PE
93  , fsnowrdg = p5 &! snow fraction that survives in ridging
94  , gstar = p15 &! max value of G(h) that participates
95  ! (krdg_partic = 0)
96  , astar = 0.05_dbl_kind &! e-folding scale for G(h) participation
97  ! (krdg_partic = 1)
98  , maxraft = c1i &! max value of hrmin - hi = max thickness
99  ! of ice that rafts (m)
100  , hstar = c25 &! determines mean thickness of ridged ice (m)
101  ! (krdg_redist = 0)
102  ! Flato & Hibler (1995) have Hstar = 100
103  , mu_rdg = c4i &! gives e-folding scale of ridged ice (m^.5)
104  ! (krdg_redist = 1)
105  , pstar = 2.75e4_dbl_kind &! constant in Hibler strength formula
106  ! (kstrength = 0)
107  , cstar = c20 ! constant in Hibler strength formula
108  ! (kstrength = 0)
109 
110 !-----------------------------------------------------------------------
111 ! Ridging diagnostic arrays for history files
112 !-----------------------------------------------------------------------
113 
114 ! real (kind=dbl_kind), dimension(ilo:ihi,jlo:jhi) :: &
115 ! & dardg1dt ! rate of fractional area loss by ridging ice (1/s)
116 ! &, dardg2dt ! rate of fractional area gain by new ridges (1/s)
117 ! &, dvirdgdt ! rate of ice volume ridged (m/s)
118 ! &, opening ! rate of opening due to divergence/shear (1/s)
119 
120  real (kind=dbl_kind), dimension(:,:),allocatable,save :: &
121  dardg1dt & ! rate of fractional area loss by ridging ice (1/s)
122  , dardg2dt & ! rate of fractional area gain by new ridges (1/s)
123  , dvirdgdt & ! rate of ice volume ridged (m/s)
124  , opening ! rate of opening due to divergence/shear (1/s)
125 
126 
127 
128 !-----------------------------------------------------------------------
129 ! Variables shared among ridging subroutines
130 !-----------------------------------------------------------------------
131 
132 ! real (kind=dbl_kind), dimension (ilo:ihi,jlo:jhi) :: &
133  real (kind=dbl_kind), dimension (:,:),allocatable,save :: &
134  asum & ! sum of total ice and open water area
135  , aksum ! ratio of area removed to area ridged
136 
137 ! real (kind=dbl_kind), dimension (ilo:ihi,jlo:jhi,0:ncat) :: &
138  real (kind=dbl_kind), dimension (:,:,:) ,allocatable,save:: &
139  apartic ! participation function; fraction of ridging/
140  ! closing associated w/ category n
141 
142 ! real (kind=dbl_kind), dimension (ilo:ihi,jlo:jhi,ncat) :: &
143  real (kind=dbl_kind), dimension (:,:,:),allocatable,save :: &
144  hrmin & ! minimum ridge thickness
145  , hrmax & ! maximum ridge thickness
146  , hrexp & ! ridge e-folding thickness (krdg_redist = 1)
147  , krdg ! mean ridge thickness/thickness of ridging ice
148 
149  logical (kind=log_kind), parameter :: &
150  l_conservation_check = .true. ! if true, check conservation
151  ! (useful for debugging)
152 
153 !=======================================================================
154 
155  contains
156 
157 !=======================================================================
158 !BOP
159 !
160 ! !ROUTINE: init_mechred
161 !
162 ! !DESCRIPTION:
163 !
164 ! Initialize some variables written to the history file
165 !
166 ! !REVISION HISTORY:
167 !
168 ! author Elizabeth C. Hunke, LANL
169 !
170 ! !INTERFACE:
171 !
172  subroutine init_mechred
173 !
174 ! !USES:
175 !
176 ! !INPUT/OUTPUT PARAMETERS:
177 !
178 !
179 !EOP
180 !
181  integer (kind=int_kind) :: i,j
182 
183  !-----------------------------------------------------------------
184  ! Initialize history fields.
185  !-----------------------------------------------------------------
186 
187  dardg1dt(:,:) = c0i
188  dardg2dt(:,:) = c0i
189  dvirdgdt(:,:) = c0i
190  opening(:,:) = c0i
191 
192  end subroutine init_mechred
193 
194 !=======================================================================
195 !BOP
196 !
197 ! !ROUTINE: ridge_ice - driver for mechanical redistribution
198 !
199 ! !DESCRIPTION:
200 !
201 ! Compute changes in the ice thickness distribution due to divergence
202 ! and shear.
203 !
204 ! !REVISION HISTORY:
205 !
206 ! authors William H. Lipscomb, LANL
207 !
208 ! !INTERFACE:
209 !
210  subroutine ridge_ice (Delta, divu)
211 !
212 ! !USES:
213 !
214 ! use ice_timers
215 
216  use ice_flux
217 ! use ice_exit
218 !
219 ! !INPUT/OUTPUT PARAMETERS:
220 !
221  real (kind=dbl_kind), &
222  dimension (imt_local,jmt_local), intent(in) :: &
223  delta & ! term in the denominator of zeta, eta (1/s)
224  ! = sqrt (epsI^2 + (1/e^2)*epsII^2)
225  , divu ! strain rate I component, velocity divergence (1/s)
226 !
227 !EOP
228 !
229  integer (kind=int_kind), parameter :: &
230  nitermax = 20 ! max number of ridging iterations
231 
232  integer (kind=int_kind) :: &
233  i,j &! horizontal indices
234  , ni &! thickness category index
235  , niter ! iteration counter
236 
237  real (kind=dbl_kind), dimension(ilo:ihi,jlo:jhi) :: &
238  closing_net &! net rate at which area is removed (1/s)
239  ! (ridging ice area - area of new ridges) / dyn_dt
240  , divu_adv &! divu as implied by transport scheme (1/s)
241  , opning &! rate of opening due to divergence/shear
242  , closing_gross &! rate at which area removed, not counting
243  ! area of new ridges
244  , msnow_mlt &! mass of snow added to ocean (kg m-2)
245  , esnow_mlt ! energy needed to melt snow in ocean (J m-2)
246 
247  real (kind=dbl_kind) :: &
248  w1 & ! temporary variable
249  , tmpfac & ! factor by which opening/closing rates are cut
250 ! , dti ! 1 / dyn_dt
251  , dti_ice ! 1 / dyn_dt ! conflict with main dti
252 ! ggao
253 
254  logical (kind=log_kind) :: &
255  iterate_ridging ! if true, repeat the ridging
256 
257  real (kind=dbl_kind), parameter :: &
258  big = 1.0e+8_dbl_kind
259 
260  logical (kind=log_kind) :: &
261  asum_error ! flag for asum .ne. 1
262 
263 ! call ice_timer_start(6) ! ridging
264 
265  !-----------------------------------------------------------------
266  ! Set hin_max(ncat) to a big value to ensure that all ridged ice
267  ! is thinner than hin_max(ncat).
268  !-----------------------------------------------------------------
269  hin_max(ncat) = big
270 
271  !-----------------------------------------------------------------
272  ! Compute the ice strength, the thickness distribution of ridging
273  ! ice, and various quantities associated with the new ridged ice.
274  !-----------------------------------------------------------------
275  call ridge_prep
276 
277  !-----------------------------------------------------------------
278  ! Compute total area of ice plus open water.
279  ! This may not be equal to one because of divergence during
280  ! transport.
281  !-----------------------------------------------------------------
282  call asum_ridging
283 
284  !-----------------------------------------------------------------
285  ! Initialize arrays.
286  !-----------------------------------------------------------------
287 
288  msnow_mlt(:,:) = c0i
289  esnow_mlt(:,:) = c0i
290  dardg1dt(:,:) = c0i
291  dardg2dt(:,:) = c0i
292  dvirdgdt(:,:) = c0i
293  opening(:,:) = c0i
294 
295 !DIR$ CONCURRENT !Cray
296 !cdir nodep !NEC
297 !ocl novrec !Fujitsu
298  do j = jlo, jhi
299  do i = ilo, ihi
300 
301  !-----------------------------------------------------------------
302  ! Compute the net rate of closing due to convergence and shear,
303  ! based on Flato and Hibler (1995).
304  !
305  ! The energy dissipation rate is equal to the net closing rate
306  ! times the ice strength.
307  !
308  ! NOTE: The NET closing rate is equal to the rate that open water
309  ! area is removed, plus the rate at which ice area is removed by
310  ! ridging, minus the rate at which area is added in new ridges.
311  ! The GROSS closing rate is equal to the first two terms (open
312  ! water closing and thin ice ridging) without the third term
313  ! (thick, newly ridged ice).
314  !-----------------------------------------------------------------
315 
316  closing_net(i,j) = &
317  cs*p5*(delta(i,j)-abs(divu(i,j))) - min(divu(i,j),c0i)
318 
319  !-----------------------------------------------------------------
320  ! Compute divu_adv, the divergence rate given by the transport/
321  ! advection scheme, which may not be equal to divu as computed
322  ! from the velocity field.
323  !
324  ! If divu_adv < 0, make sure the closing rate is large enough
325  ! to give asum = 1.0 after ridging.
326  !-----------------------------------------------------------------
327 
328  divu_adv(i,j) = (c1i-asum(i,j)) / dyn_dt
329 
330  if (divu_adv(i,j) < c0i) &
331  closing_net(i,j) = max(closing_net(i,j), -divu_adv(i,j))
332 
333  !-----------------------------------------------------------------
334  ! Compute the (non-negative) opening rate that will give
335  ! asum = 1.0 after ridging.
336  !-----------------------------------------------------------------
337  opning(i,j) = closing_net(i,j) + divu_adv(i,j)
338  enddo
339  enddo
340 
341 
342  do niter = 1, nitermax ! iteration counter
343 
344 !DIR$ CONCURRENT !Cray
345 !cdir nodep !NEC
346 !ocl novrec !Fujitsu
347  do j = jlo, jhi
348  do i = ilo, ihi
349 
350  !-----------------------------------------------------------------
351  ! Based on the ITD of ridging and ridged ice, convert the net
352  ! closing rate to a gross closing rate.
353  ! NOTE: 0 < aksum <= 1
354  !-----------------------------------------------------------------
355 
356 
357  closing_gross(i,j) = closing_net(i,j) / aksum(i,j)
358 
359  !-----------------------------------------------------------------
360  ! Reduce the closing rate if more than 100% of the open water
361  ! would be removed. Reduce the opening rate proportionately.
362  !-----------------------------------------------------------------
363 
364  if (apartic(i,j,0) > c0i) then
365  w1 = apartic(i,j,0) * closing_gross(i,j) * dyn_dt
366  if (w1 > aice0(i,j)) then
367  tmpfac = aice0(i,j) / w1
368  closing_gross(i,j) = closing_gross(i,j) * tmpfac
369  opning(i,j) = opning(i,j) * tmpfac
370  endif
371  endif
372  enddo ! i
373  enddo ! j
374 
375  !-----------------------------------------------------------------
376  ! Reduce the closing rate if more than 100% of any ice category
377  ! would be removed. Reduce the opening rate proportionately.
378  !-----------------------------------------------------------------
379  do ni = 1, ncat
380 !DIR$ CONCURRENT !Cray
381 !cdir nodep !NEC
382 !ocl novrec !Fujitsu
383  do j = jlo, jhi
384  do i = ilo, ihi
385 
386  if (aicen(i,j,ni) > puny .and. apartic(i,j,ni) > c0i) then
387  w1 = apartic(i,j,ni) * closing_gross(i,j) * dyn_dt
388  if (w1 > aicen(i,j,ni)) then
389  tmpfac = aicen(i,j,ni) / w1
390  closing_gross(i,j) = closing_gross(i,j) * tmpfac
391  opning(i,j) = opning(i,j) * tmpfac
392  endif
393  endif
394 
395  enddo ! i
396  enddo ! j
397  enddo ! n
398 
399  !-----------------------------------------------------------------
400  ! Redistribute area, volume, and energy.
401  !-----------------------------------------------------------------
402  call ridge_shift (opning, closing_gross, &
403  msnow_mlt, esnow_mlt)
404 
405  !-----------------------------------------------------------------
406  ! Compute total area of ice plus open water after ridging.
407  !-----------------------------------------------------------------
408  call asum_ridging
409 
410  !-----------------------------------------------------------------
411  ! Check whether asum = 1. If not (because the closing and opening
412  ! rates were reduced above), ridge again with new rates.
413  !-----------------------------------------------------------------
414 
415  iterate_ridging = .false.
416 
417  do j = jlo, jhi
418  do i = ilo, ihi
419  if (abs(asum(i,j) - c1i) < puny) then
420  closing_net(i,j) = c0i ! no ridging the next time through
421  opning(i,j) = c0i
422  else
423  iterate_ridging = .true.
424  divu_adv(i,j) = (c1i - asum(i,j)) / dyn_dt
425  closing_net(i,j) = max(c0i, -divu_adv(i,j))
426  opning(i,j) = max(c0i, divu_adv(i,j))
427  endif
428  enddo
429  enddo
430 
431  !-----------------------------------------------------------------
432  ! Repeat if necessary.
433  !-----------------------------------------------------------------
434 
435  if (iterate_ridging) then
436  if (niter > nitermax) then
437  write(nu_diag,*) 'istep1, my_task, nitermax =', &
438  istep1, my_task, nitermax
439 ! call abort_ice('Exceeded max number of ridging iterations')
440  endif
441 ! write(nu_diag,*) 'REPEAT RIDGING, istep1, my_task, niter =', &
442 ! istep1, my_task, niter
443  call ridge_prep
444  else
445  exit
446  endif
447 
448  enddo ! niter
449 
450  !-----------------------------------------------------------------
451  ! Convert ridging rate diagnostics to correct units.
452  !
453  ! Update fresh water and heat fluxes due to snow melt.
454  !-----------------------------------------------------------------
455 
456  dti_ice = c1i/dyn_dt
457 
458  asum_error = .false.
459 
460 !DIR$ CONCURRENT !Cray
461 !cdir nodep !NEC
462 !ocl novrec !Fujitsu
463  do j = jlo, jhi
464  do i = ilo, ihi
465 
466  if (abs(asum(i,j) - c1i) > puny) asum_error = .true.
467 
468  dardg1dt(i,j) = dardg1dt(i,j) * dti_ice
469  dardg2dt(i,j) = dardg2dt(i,j) * dti_ice
470  dvirdgdt(i,j) = dvirdgdt(i,j) * dti_ice
471  opening(i,j) = opening(i,j) * dti_ice
472 
473  ! fresh water source for ocean
474  fresh(i,j) = fresh(i,j) + msnow_mlt(i,j)*dti_ice
475  fresh_hist(i,j) = fresh_hist(i,j) + msnow_mlt(i,j)*dti_ice
476 
477  ! heat sink for ocean
478  fhnet(i,j) = fhnet(i,j) + esnow_mlt(i,j)*dti_ice
479  fhnet_hist(i,j) = fhnet_hist(i,j) + esnow_mlt(i,j)*dti_ice
480 
481  enddo
482  enddo
483 
484  !-----------------------------------------------------------------
485  ! Abort if area does not add up to one.
486  !-----------------------------------------------------------------
487 
488  if (asum_error) then
489  do j = jlo, jhi
490  do i = ilo, ihi
491  if (abs(asum(i,j) - c1i) > puny) then ! there is a bug
492  write(nu_diag,*) ' '
493  write(nu_diag,*) 'Ridging error: total area =', asum(i,j)
494  write(nu_diag,*) 'istep1, my_task, i, j:', &
495  istep1, my_task, i, j
496  ! istep1, my_task, i, ngid(j),aice(i,j)
497  write(nu_diag,*) 'n, aicen, apartic:'
498  write(nu_diag,*) 0, aice0(i,j), apartic(i,j,0)
499  do ni = 1, ncat
500  write(nu_diag,*) ni, aicen(i,j,ni), apartic(i,j,ni)
501  enddo
502 ! call abort_ice('ridging: total area must be <= 1')
503  endif
504  enddo
505  enddo
506  endif
507 
508 ! call ice_timer_stop(6) ! ridging
509 
510  end subroutine ridge_ice
511 
512 !=======================================================================
513 !BOP
514 !
515 ! !ROUTINE: ice_strength - compute ice strength
516 !
517 ! !DESCRIPTION:
518 !
519 ! Compute the strength of the ice pack, defined as the energy (J m-2)
520 ! dissipated per unit area removed from the ice pack under compression,
521 ! and assumed proportional to the change in potential energy caused
522 ! by ridging.
523 !
524 ! See Rothrock (1975) and Hibler (1980).
525 !
526 ! For simpler strength parameterization, see this reference:
527 ! Hibler, W. D. III, 1979: A dynamic-thermodynamic sea ice model,
528 ! J. Phys. Oceanog., 9, 817-846.
529 !
530 ! !REVISION HISTORY:
531 !
532 ! authors William H. Lipscomb, LANL
533 ! Elizabeth C. Hunke, LANL
534 !
535 ! !INTERFACE:
536 !
537  subroutine ice_strength (kstrngth)
538 !
539 ! !USES:
540 !
541 ! !INPUT/OUTPUT PARAMETERS:
542 !
543  integer (kind=int_kind), intent(in) :: &
544  kstrngth ! = 1 for Rothrock formulation, 0 for Hibler (1979)
545 !
546 !EOP
547 !
548  integer (kind=int_kind) :: &
549  i,j & ! horizontal indices
550  , ni ! thickness category index
551 
552  real (kind=dbl_kind) :: &
553  hi & ! ice thickness (m)
554  , h2rdg & ! mean value of h^2 in new ridge
555  , dh2rdg ! change in mean value of h^2 per unit area
556  ! consumed by ridging
557 
558 
559  ! initialize
560  strength(:,:) = c0i
561 
562  !-----------------------------------------------------------------
563  ! Compute thickness distribution of ridging and ridged ice.
564  !-----------------------------------------------------------------
565  call ridge_prep
566 
567  if (kstrngth == 1) then
568 
569  !-----------------------------------------------------------------
570  ! Compute ice strength based on change in potential energy,
571  ! as in Rothrock (1975)
572  !-----------------------------------------------------------------
573 
574  if (krdg_redist==0) then ! Hibler redistribution function
575 
576  do ni = 1, ncat
577 !DIR$ CONCURRENT !Cray
578 !cdir nodep !NEC
579 !ocl novrec !Fujitsu
580  do j = jlo, jhi
581  do i = ilo, ihi
582 
583  if(aicen(i,j,ni) > puny .and. apartic(i,j,ni) > c0i) then
584  hi = vicen(i,j,ni) / aicen(i,j,ni)
585  h2rdg = p333 * (hrmax(i,j,ni)**3 - hrmin(i,j,ni)**3) &
586  / (hrmax(i,j,ni) - hrmin(i,j,ni))
587  dh2rdg = -hi*hi + h2rdg/krdg(i,j,ni)
588  strength(i,j) = strength(i,j) &
589  + apartic(i,j,ni) * dh2rdg
590  endif
591  enddo ! i
592  enddo ! j
593  enddo ! n
594 
595  elseif (krdg_redist==1) then ! exponential function
596 
597  do ni = 1, ncat
598 !DIR$ CONCURRENT !Cray
599 !cdir nodep !NEC
600 !ocl novrec !Fujitsu
601  do j = jlo, jhi
602  do i = ilo, ihi
603 
604  if(aicen(i,j,ni) > puny .and. apartic(i,j,ni) > c0i) then
605  hi = vicen(i,j,ni) / aicen(i,j,ni)
606  h2rdg = hrmin(i,j,ni)*hrmin(i,j,ni) &
607  + c2i*hrmin(i,j,ni)*hrexp(i,j,ni) &
608  + c2i*hrexp(i,j,ni)*hrexp(i,j,ni)
609  dh2rdg = -hi*hi + h2rdg/krdg(i,j,ni)
610  strength(i,j) = strength(i,j) &
611  + apartic(i,j,ni) * dh2rdg
612  endif
613  enddo ! i
614  enddo ! j
615  enddo ! n
616 
617  endif ! krdg_redist
618 
619 !DIR$ CONCURRENT !Cray
620 !cdir nodep !NEC
621 !ocl novrec !Fujitsu
622  do j = jlo, jhi
623  do i = ilo, ihi
624 
625  strength(i,j) = cf * cp * strength(i,j) / aksum(i,j)
626  ! Cp = (g/2)*(rhow-rhoi)*(rhoi/rhow)
627  ! Cf accounts for frictional dissipation
628 
629  enddo ! j
630  enddo ! i
631 
632  else ! kstrngth ne 1: Hibler (1979) form
633 
634  !-----------------------------------------------------------------
635  ! Compute ice strength as in Hibler (1979)
636  !-----------------------------------------------------------------
637  do j = jlo, jhi
638  do i = ilo, ihi
639  strength(i,j) = pstar*vice(i,j)*exp(-cstar*(c1i-aice(i,j)))
640  enddo ! j
641  enddo ! i
642 
643  endif ! kstrngth
644 
645  end subroutine ice_strength
646 
647 !=======================================================================
648 !BOP
649 !
650 ! !ROUTINE: ridge_prep - preparation for ridging and strength calculations
651 !
652 ! !DESCRIPTION:
653 !
654 ! Compute the thickness distribution of the ice and open water
655 ! participating in ridging and of the resulting ridges.
656 !
657 ! This version includes new options for ridging participation and
658 ! redistribution.
659 ! The new participation scheme (krdg_partic = 1) improves model
660 ! stability by increasing the time scale for large changes in ice strength.
661 ! The new exponential redistribution function (krdg_redist = 1) improves
662 ! agreement between ITDs of modeled and observed ridges.
663 !
664 ! !REVISION HISTORY:
665 !
666 ! authors William H. Lipscomb, LANL
667 !
668 ! 2006: Added new options for ridging participation and redistribution.
669 !
670 ! !INTERFACE:
671 !
672  subroutine ridge_prep
673 !
674 ! !USES:
675 !
676 ! !INPUT/OUTPUT PARAMETERS:
677 !
678 !EOP
679 !
680  integer (kind=int_kind) :: &
681  i,j &! horizontal indices
682  , ni ! thickness category index
683 
684  real (kind=dbl_kind) , parameter :: &
685  gstari = c1i/gstar &
686  , astari = c1i/astar
687 
688  real (kind=dbl_kind) , dimension(ilo:ihi,jlo:jhi,-1:ncat) :: &
689  gsum ! Gsum(n) = sum of areas in categories 0 to n
690 
691  real (kind=dbl_kind) :: &
692  hi &! ice thickness for each cat (m)
693  , hieff &! effective ice thickness (m) (krdg_redist = 2)
694  , hrmean &! mean ridge thickness (m)
695  , xtmp ! temporary variable
696 
697  !-----------------------------------------------------------------
698  ! Initialize
699  !-----------------------------------------------------------------
700 
701  aksum(:,:) = c0i
702 
703  do ni = 0, ncat
704  apartic(:,:,ni) = c0i
705  enddo
706 
707  do ni = 1, ncat
708  hrmin(:,:,ni) = c0i
709  hrmax(:,:,ni) = c0i
710  hrexp(:,:,ni) = c0i
711  krdg(:,:,ni) = c1i
712  enddo
713 
714  !-----------------------------------------------------------------
715  ! Compute the thickness distribution of ice participating in ridging.
716  !-----------------------------------------------------------------
717 
718  !-----------------------------------------------------------------
719  ! First compute the cumulative thickness distribution function Gsum,
720  ! where Gsum(n) is the fractional area in categories 0 to n.
721  ! Ignore categories with very small areas.
722  !-----------------------------------------------------------------
723 
724  gsum(:,:,-1) = c0i
725 
726 !DIR$ CONCURRENT !Cray
727 !cdir nodep !NEC
728 !ocl novrec !Fujitsu
729  do j = jlo, jhi
730  do i = ilo, ihi
731  if (aice0(i,j) > puny) then
732  gsum(i,j,0) = aice0(i,j)
733  else
734  gsum(i,j,0) = gsum(i,j,-1)
735  endif
736  enddo
737  enddo
738 
739  do ni = 1, ncat
740 !DIR$ CONCURRENT !Cray
741 !cdir nodep !NEC
742 !ocl novrec !Fujitsu
743  do j = jlo, jhi
744  do i = ilo, ihi
745  if (aicen(i,j,ni) > puny) then
746  gsum(i,j,ni) = gsum(i,j,ni-1) + aicen(i,j,ni)
747  else
748  gsum(i,j,ni) = gsum(i,j,ni-1)
749  endif
750  enddo
751  enddo
752  enddo
753 
754  ! normalize
755 
756  worka(:,:) = c1i / gsum(:,:,ncat)
757 
758  do ni = 0, ncat
759 !DIR$ CONCURRENT !Cray
760 !cdir nodep !NEC
761 !ocl novrec !Fujitsu
762  do j = jlo, jhi
763  do i = ilo, ihi
764  gsum(i,j,ni) = gsum(i,j,ni) * worka(i,j)
765  enddo
766  enddo
767  enddo
768 
769  !-----------------------------------------------------------------
770  ! Compute the participation function apartic; this is analogous to
771  ! a(h) = b(h)g(h) as defined in Thorndike et al. (1975).
772  !
773  ! area lost from category n due to ridging/closing
774  ! apartic(n) = ---------------------------------------------------
775  ! total area lost due to ridging/closing
776  !
777  !-----------------------------------------------------------------
778 
779  if (krdg_partic==0) then ! Thorndike et al. 1975
780 
781  !-----------------------------------------------------------------
782  ! b(h) = (2/Gstar) * (1 - G(h)/Gstar).
783  ! The expressions for apartic are found by integrating b(h)g(h)
784  ! between the category boundaries.
785  !-----------------------------------------------------------------
786 
787  do ni = 0, ncat
788  do j = jlo, jhi
789  do i = ilo, ihi
790 
791  if (gsum(i,j,ni) < gstar) then
792  apartic(i,j,ni) = gstari * (gsum(i,j,ni)-gsum(i,j,ni-1)) &
793  * (c2i - (gsum(i,j,ni-1)+gsum(i,j,ni))*gstari)
794  elseif (gsum(i,j,ni-1) < gstar) then
795  apartic(i,j,ni) = gstari * (gstar-gsum(i,j,ni-1)) &
796  * (c2i - (gsum(i,j,ni-1)+gstar)*gstari)
797  endif
798 
799  enddo ! i
800  enddo ! j
801  enddo ! ni
802 
803  elseif (krdg_partic==1) then ! exponential dependence on G(h)
804 
805  !-----------------------------------------------------------------
806  ! b(h) = exp(-G(h)/astar)
807  ! apartic(n) = [exp(-G(ni-1)/astar - exp(-G(n)/astar] / [1-exp(-1/astar)].
808  ! The expression for apartic is found by integrating b(h)g(h)
809  ! between the category boundaries.
810  !-----------------------------------------------------------------
811 
812  ! precompute exponential terms using Gsum as work array
813 
814  xtmp = c1i / (c1i-exp(-astari))
815 
816  do ni = -1, ncat
817 !DIR$ CONCURRENT !Cray
818 !cdir nodep !NEC
819 !ocl novrec !Fujitsu
820  do j = jlo, jhi
821  do i = ilo, ihi
822  gsum(i,j,ni) = exp(-gsum(i,j,ni)*astari) * xtmp
823  enddo ! i
824  enddo ! j
825  enddo ! n
826 
827  ! compute apartic
828 
829  do ni = 0, ncat
830 !DIR$ CONCURRENT !Cray
831 !cdir nodep !NEC
832 !ocl novrec !Fujitsu
833  do j = jlo, jhi
834  do i = ilo, ihi
835  apartic(i,j,ni) = gsum(i,j,ni-1) - gsum(i,j,ni)
836  enddo ! i
837  enddo ! j
838  enddo ! n
839 
840  endif ! krdg_partic
841 
842  !-----------------------------------------------------------------
843  ! Compute variables related to ITD of ridged ice:
844  !
845  ! krdg = mean ridge thickness / thickness of ridging ice
846  ! hrmin = min ridge thickness
847  ! hrmax = max ridge thickness (krdg_redist = 0)
848  ! hrexp = ridge e-folding scale (krdg_redist = 1)
849  !----------------------------------------------------------------
850 
851  if (krdg_redist == 0) then ! Hibler 1980 formulation
852 
853  !-----------------------------------------------------------------
854  ! Assume ridged ice is uniformly distributed between hrmin and hrmax.
855  !
856  ! This parameterization is a modified version of Hibler (1980).
857  ! In the original paper the min ridging thickness is hrmin = 2*hi,
858  ! and the max thickness is hrmax = 2*sqrt(hi*Hstar).
859  !
860  ! Here the min thickness is hrmin = min(2*hi, hi+maxraft),
861  ! so thick ridging ice is not required to raft.
862  !
863  !-----------------------------------------------------------------
864 
865  do ni = 1, ncat
866  do j = jlo, jhi
867  do i = ilo, ihi
868 
869  if (aicen(i,j,ni) > puny) then
870  hi = vicen(i,j,ni) / aicen(i,j,ni)
871  hrmin(i,j,ni) = min(c2i*hi, hi + maxraft)
872  hrmax(i,j,ni) = c2i*sqrt(hstar*hi)
873  hrmax(i,j,ni) = max(hrmax(i,j,ni), hrmin(i,j,ni)+puny)
874  hrmean = p5 * (hrmin(i,j,ni) + hrmax(i,j,ni))
875  krdg(i,j,ni) = hrmean / hi
876  endif
877 
878  enddo ! i
879  enddo ! j
880  enddo ! n
881 
882  else ! krdg_redist = 1; exponential redistribution
883 
884  !-----------------------------------------------------------------
885  ! The ridge ITD is a negative exponential:
886  !
887  ! g(h) ~ exp[-(h-hrmin)/hrexp], h >= hrmin
888  !
889  ! where hrmin is the minimum thickness of ridging ice and
890  ! hrexp is the e-folding thickness.
891  !
892  ! Here, assume as above that hrmin = min(2*hi, hi+maxraft).
893  ! That is, the minimum ridge thickness results from rafting,
894  ! unless the ice is thicker than maxraft.
895  !
896  ! Also, assume that hrexp = mu_rdg*sqrt(hi).
897  ! The parameter mu_rdg is tuned to give e-folding scales mostly
898  ! in the range 2-4 m as observed by upward-looking sonar.
899  !
900  ! Values of mu_rdg in the right column give ice strengths
901  ! roughly equal to values of Hstar in the left column
902  ! (within ~10 kN/m for typical ITDs):
903  !
904  ! Hstar mu_rdg
905  !
906  ! 25 3.0
907  ! 50 4.0
908  ! 75 5.0
909  ! 100 6.0
910  !-----------------------------------------------------------------
911 
912  do ni = 1, ncat
913  do j = jlo, jhi
914  do i = ilo, ihi
915  if (aicen(i,j,ni) > puny) then
916  hi = vicen(i,j,ni) / aicen(i,j,ni)
917  hrmin(i,j,ni) = min(c2i*hi, hi + maxraft)
918  hrexp(i,j,ni) = mu_rdg * sqrt(hi)
919  krdg(i,j,ni) = (hrmin(i,j,ni) + hrexp(i,j,ni)) / hi
920  endif
921  enddo
922  enddo
923  enddo
924 
925  endif ! krdg_redist
926 
927  !----------------------------------------------------------------
928  ! Compute aksum = net ice area removed / total area participating.
929  ! For instance, if a unit area of ice with h = 1 participates in
930  ! ridging to form a ridge with a = 1/3 and h = 3, then
931  ! aksum = 1 - 1/3 = 2/3.
932  !----------------------------------------------------------------
933 
934  do j = jlo, jhi
935  do i = ilo, ihi
936  aksum(i,j) = apartic(i,j,0) ! area participating = area removed
937  enddo
938  enddo
939 
940  do ni = 1, ncat
941  do j = jlo, jhi
942  do i = ilo, ihi
943  ! area participating > area removed
944  aksum(i,j) = aksum(i,j) &
945  + apartic(i,j,ni) * (c1i - c1i/krdg(i,j,ni))
946  enddo
947  enddo
948  enddo
949 
950  end subroutine ridge_prep
951 
952 !=======================================================================
953 !BOP
954 !
955 ! !ROUTINE: ridge_shift - shift ridging ice among thickness categories
956 !
957 ! !DESCRIPTION:
958 !
959 ! Remove area, volume, and energy from each ridging category
960 ! and add to thicker ice categories.
961 !
962 ! !REVISION HISTORY:
963 !
964 ! author William H. Lipscomb, LANL
965 !
966 ! !INTERFACE:
967 !
968  subroutine ridge_shift (opning, closing_gross, &
969  msnow_mlt, esnow_mlt)
970 !
971 ! !USES:
972 !
973 ! use ice_exit
974 ! ggao
975 
976 !
977 ! !INPUT/OUTPUT PARAMETERS:
978 !
979  real (kind=dbl_kind), dimension(ilo:ihi,jlo:jhi), intent(in) :: &
980  opning & ! rate of opening due to divergence/shear
981  , closing_gross ! rate at which area removed, not counting
982  ! area of new ridges
983 
984  real (kind=dbl_kind), dimension(ilo:ihi,jlo:jhi), intent(inout) :: &
985  msnow_mlt & ! mass of snow added to ocean (kg m-2)
986  , esnow_mlt ! energy needed to melt snow in ocean (J m-2)
987 !
988 !EOP
989 !
990  integer (kind=int_kind) :: &
991  i,j & ! horizontal indices
992  , ni, n1, n2 & ! thickness category indices
993  , k & ! ice layer index
994  , ij & ! horizontal index, combines i and j loops
995  , icells ! number of cells with aicen > puny
996 
997  integer (kind=int_kind), dimension(1:(ihi-ilo+1)*(jhi-jlo+1)) :: &
998  indxi, indxj ! compressed indices
999 
1000  real (kind=dbl_kind), dimension (imt_local,jmt_local) :: &
1001  vice_init, vice_final & ! ice volume summed over categories
1002  , eice_init, eice_final ! ice energy summed over layers
1003 
1004  real (kind=dbl_kind), dimension (imt_local,jmt_local,ncat) :: &
1005  aicen_init & ! ice area before ridging
1006  , vicen_init & ! ice volume before ridging
1007  , vsnon_init & ! snow volume before ridging
1008  , esnon_init ! snow energy before ridging
1009 
1010  real (kind=dbl_kind), dimension (imt_local,jmt_local,ntilay) :: &
1011  eicen_init ! ice energy before ridging
1012 
1013  real (kind=dbl_kind), dimension (ilo:ihi,jlo:jhi) :: &
1014  afrac & ! fraction of category area ridged
1015  , ardg1 & ! area of ice ridged
1016  , ardg2 & ! area of new ridges
1017  , virdg & ! ice volume of ridging ice
1018  , vsrdg & ! snow volume of ridging ice
1019  , esrdg & ! snow energy of ridging ice
1020  , dhr & ! hrmax - hrmin
1021  , dhr2 & ! hrmax^2 - hrmin^2
1022  , farea & ! fraction of new ridge area going to n2
1023  , fvol ! fraction of new ridge volume going to n2
1024 
1025  real (kind=dbl_kind), dimension (ilo:ihi,jlo:jhi,nilyr) :: &
1026  eirdg ! ice energy of ridging ice
1027 
1028  real (kind=dbl_kind) :: &
1029  hi1 & ! thickness of ridging ice
1030  , hexp & ! ridge e-folding thickness
1031  , hl, hr & ! left and right limits of integration
1032  , expl, expr ! exponentials involving hL, hR
1033 
1034  character (len=char_len) :: &
1035  fieldid ! field identifier
1036 
1037  logical (kind=log_kind) :: &
1038  neg_aice0 & ! flag for aice0(i,j) < -puny
1039  , large_ardg ! flag for ardg > aicen_init
1040 
1041  !-----------------------------------------------------------------
1042  ! Compute quantities that ridging should conserve
1043  ! (not done for snow because snow may be dumped in ocean)
1044  !-----------------------------------------------------------------
1045 
1046  if (l_conservation_check) then
1047  call column_sum (ncat, vicen, vice_init)
1048  call column_sum (ntilay, eicen, eice_init)
1049  endif
1050 
1051  !-----------------------------------------------------------------
1052  ! Compute change in open water area due to closing and opening.
1053  !-----------------------------------------------------------------
1054 
1055  neg_aice0 = .false.
1056 
1057 !DIR$ CONCURRENT !Cray
1058 !cdir nodep !NEC
1059 !ocl novrec !Fujitsu
1060  do j = jlo, jhi
1061  do i = ilo, ihi
1062  aice0(i,j) = aice0(i,j) &
1063  - apartic(i,j,0)*closing_gross(i,j)*dyn_dt &
1064  + opning(i,j)*dyn_dt
1065 
1066  if (aice0(i,j) < -puny) then
1067  neg_aice0 = .true.
1068  aice0(i,j)= c0i
1069  elseif (aice0(i,j) < c0i) then ! roundoff error
1070  aice0(i,j) = c0i
1071  endif
1072  enddo
1073  enddo
1074 
1075  IF(.false.)THEN
1076  if (neg_aice0) then ! there is a bug
1077  do j = jlo, jhi
1078  do i = ilo, ihi
1079  if (aice0(i,j) < -puny) then
1080  write (nu_diag,*) ' '
1081  write (nu_diag,*) 'Ridging error: aice0 < 0'
1082  write (nu_diag,*) 'istep1, my_task, i, j:', &
1083  istep1, my_task, i, j
1084  ! istep1, my_task, i, ngid(j),aice(i,j)
1085  write (nu_diag,*) 'aice0:', aice0(i,j)
1086 ! call abort_ice('ridging: aice0 must be >= 0')
1087  endif ! aice0 < -puny
1088  enddo ! i
1089  enddo ! j
1090  endif ! neg_aice0
1091  ENDIF
1092 
1093  !-----------------------------------------------------------------
1094  ! Save initial state variables
1095  !-----------------------------------------------------------------
1096 
1097  aicen_init(:,:,:) = aicen(:,:,:)
1098  vicen_init(:,:,:) = vicen(:,:,:)
1099  vsnon_init(:,:,:) = vsnon(:,:,:)
1100  aicen_init(:,:,:) = aicen(:,:,:)
1101  esnon_init(:,:,:) = esnon(:,:,:)
1102  eicen_init(:,:,:) = eicen(:,:,:)
1103 
1104  !-----------------------------------------------------------------
1105  ! Compute the area, volume, and energy of ice ridging in each
1106  ! category, along with the area of the resulting ridge.
1107  !-----------------------------------------------------------------
1108 
1109  do n1 = 1, ncat
1110 
1111  !-----------------------------------------------------------------
1112  ! Identify grid cells with nonzero ridging
1113  !-----------------------------------------------------------------
1114 
1115  icells = 0
1116  do j = jlo, jhi
1117  do i = ilo, ihi
1118  if (aicen_init(i,j,n1) > puny .and. apartic(i,j,n1) > c0i &
1119  .and. closing_gross(i,j) > c0i) then
1120  icells = icells + 1
1121  indxi(icells) = i
1122  indxj(icells) = j
1123  endif
1124  enddo ! i
1125  enddo ! j
1126 
1127  large_ardg = .false.
1128 
1129 !DIR$ CONCURRENT !Cray
1130 !cdir nodep !NEC
1131 !ocl novrec !Fujitsu
1132  do ij = 1, icells
1133  i = indxi(ij)
1134  j = indxj(ij)
1135 
1136  !-----------------------------------------------------------------
1137  ! Compute area of ridging ice (ardg1) and of new ridge (ardg2).
1138  ! Make sure ardg1 <= aiceninit.
1139  !-----------------------------------------------------------------
1140 
1141  ardg1(i,j) = apartic(i,j,n1)*closing_gross(i,j)*dyn_dt
1142 
1143  if (ardg1(i,j) > aicen_init(i,j,n1) + puny) then
1144  large_ardg = .true.
1145  else ! correct for roundoff error
1146  ardg1(i,j) = min(ardg1(i,j),aicen_init(i,j,n1))
1147  endif
1148 
1149  ardg2(i,j) = ardg1(i,j) / krdg(i,j,n1)
1150  afrac(i,j) = ardg1(i,j) / aicen_init(i,j,n1)
1151 
1152  !-----------------------------------------------------------------
1153  ! Subtract area, volume, and energy from ridging category n1.
1154  ! (Ice energy in separate loop for vector friendliness)
1155  !-----------------------------------------------------------------
1156 
1157  virdg(i,j) = vicen_init(i,j,n1) * afrac(i,j)
1158  vsrdg(i,j) = vsnon_init(i,j,n1) * afrac(i,j)
1159  esrdg(i,j) = esnon_init(i,j,n1) * afrac(i,j)
1160 
1161  aicen(i,j,n1) = aicen(i,j,n1) - ardg1(i,j)
1162  vicen(i,j,n1) = vicen(i,j,n1) - virdg(i,j)
1163  vsnon(i,j,n1) = vsnon(i,j,n1) - vsrdg(i,j)
1164  esnon(i,j,n1) = esnon(i,j,n1) - esrdg(i,j)
1165 
1166  !-----------------------------------------------------------------
1167  ! Increment ridging diagnostics
1168  !-----------------------------------------------------------------
1169 
1170  dardg1dt(i,j) = dardg1dt(i,j) + ardg1(i,j)
1171  dardg2dt(i,j) = dardg2dt(i,j) + ardg2(i,j)
1172  dvirdgdt(i,j) = dvirdgdt(i,j) + virdg(i,j)
1173  opening(i,j) = opening(i,j) + opning(i,j)*dyn_dt
1174 
1175  !-----------------------------------------------------------------
1176  ! Place part of the snow lost by ridging into the ocean.
1177  ! Note that esnow_mlt < 0; the ocean must cool to melt snow.
1178  ! If the ocean temp = Tf already, new ice must grow.
1179  !-----------------------------------------------------------------
1180 
1181  msnow_mlt(i,j) = msnow_mlt(i,j) &
1182  + rhos*vsrdg(i,j)*(c1i-fsnowrdg)
1183  esnow_mlt(i,j) = esnow_mlt(i,j) &
1184  + esrdg(i,j)*(c1i-fsnowrdg)
1185 
1186  !-----------------------------------------------------------------
1187  ! Compute quantities used to apportion ice among categories
1188  ! in the n2 loop below
1189  !-----------------------------------------------------------------
1190 
1191  dhr(i,j) = hrmax(i,j,n1) - hrmin(i,j,n1)
1192  dhr2(i,j) = hrmax(i,j,n1) * hrmax(i,j,n1) &
1193  - hrmin(i,j,n1) * hrmin(i,j,n1)
1194 
1195  enddo ! ij
1196 
1197  !-----------------------------------------------------------------
1198  ! Subtract ice energy from ridging category n1.
1199  !-----------------------------------------------------------------
1200 
1201  do k = 1, nilyr
1202 !DIR$ CONCURRENT !Cray
1203 !cdir nodep !NEC
1204 !ocl novrec !Fujitsu
1205  do ij = 1, icells
1206  i = indxi(ij)
1207  j = indxj(ij)
1208 
1209  eirdg(i,j,k) = eicen_init(i,j,ilyr1(n1)+k-1) * afrac(i,j)
1210  eicen(i,j,ilyr1(n1)+k-1) = eicen(i,j,ilyr1(n1)+k-1) &
1211  - eirdg(i,j,k)
1212  enddo
1213  enddo
1214 
1215  if (large_ardg) then ! there is a bug
1216  do ij = 1, icells
1217  i = indxi(ij)
1218  j = indxj(ij)
1219  if (ardg1(i,j) > aicen_init(i,j,n1) + puny) then
1220  write (nu_diag,*) ''
1221  write (nu_diag,*) 'ardg > aicen'
1222  write (nu_diag,*) 'istep1, my_task, i, j, n:', &
1223  istep1, my_task, i, j, n1
1224  write (nu_diag,*) 'ardg, aicen_init:', &
1225  ardg1(i,j), aicen_init(i,j,n1)
1226 ! call abort_ice ('ridging: ardg must be <= aicen')
1227  endif ! ardg1 > aicen_init
1228  enddo ! ij
1229  endif ! large_ardg
1230 
1231  !-----------------------------------------------------------------
1232  ! Add area, volume, and energy of new ridge to each category n2.
1233  !-----------------------------------------------------------------
1234 
1235  do n2 = 1, ncat
1236 
1237  if (krdg_redist == 0) then ! Hibler 1980 formulation
1238 
1239  do ij = 1, icells
1240  i = indxi(ij)
1241  j = indxj(ij)
1242 
1243  !-----------------------------------------------------------------
1244  ! Compute the fraction of ridged ice area and volume going to
1245  ! thickness category n2.
1246  !-----------------------------------------------------------------
1247 
1248  if (hrmin(i,j,n1) >= hin_max(n2) .or. &
1249  hrmax(i,j,n1) <= hin_max(n2-1)) then
1250  hl = c0i
1251  hr = c0i
1252  else
1253  hl = max(hrmin(i,j,n1), hin_max(n2-1))
1254  hr = min(hrmax(i,j,n1), hin_max(n2))
1255  endif
1256 
1257  ! fraction of ridged ice area and volume going to n2
1258  farea(i,j) = (hr-hl) / dhr(i,j)
1259  fvol(i,j) = (hr*hr - hl*hl) / dhr2(i,j)
1260 
1261  enddo ! ij
1262 
1263  else ! krdg_redist = 1; exponential formulation
1264 
1265  !-----------------------------------------------------------------
1266  ! Compute the fraction of ridged ice area and volume going to
1267  ! thickness category n2.
1268  !-----------------------------------------------------------------
1269 
1270  if (n2 < ncat) then
1271 
1272  do ij = 1, icells
1273  i = indxi(ij)
1274  j = indxj(ij)
1275 
1276  hi1 = hrmin(i,j,n1)
1277  hexp = hrexp(i,j,n1)
1278 
1279  if (hi1 >= hin_max(n2)) then
1280  farea(i,j) = c0i
1281  fvol(i,j) = c0i
1282  else
1283  hl = max(hi1, hin_max(n2-1))
1284  hr = hin_max(n2)
1285  expl = exp(-(hl-hi1)/hexp)
1286  expr = exp(-(hr-hi1)/hexp)
1287  farea(i,j) = expl - expr
1288  fvol(i,j) = ((hl + hexp)*expl &
1289  - (hr + hexp)*expr) / (hi1 + hexp)
1290  endif
1291  enddo ! ij
1292 
1293  else ! n2 = ncat
1294 
1295  do ij = 1, icells
1296  i = indxi(ij)
1297  j = indxj(ij)
1298 
1299  hi1 = hrmin(i,j,n1)
1300  hexp = hrexp(i,j,n1)
1301 
1302  hl = max(hi1, hin_max(n2-1))
1303  expl = exp(-(hl-hi1)/hexp)
1304  farea(i,j) = expl
1305  fvol(i,j) = (hl + hexp)*expl / (hi1 + hexp)
1306 
1307  enddo
1308 
1309  endif ! n2 < ncat
1310 
1311  endif ! krdg_redist
1312 
1313  !-----------------------------------------------------------------
1314  ! Transfer ice area, ice and snow volume, and snow energy to
1315  ! category n2.
1316  !-----------------------------------------------------------------
1317 
1318 !DIR$ CONCURRENT !Cray
1319 !cdir nodep !NEC
1320 !ocl novrec !Fujitsu
1321  do ij = 1, icells
1322  i = indxi(ij)
1323  j = indxj(ij)
1324  aicen(i,j,n2) = aicen(i,j,n2) + farea(i,j)*ardg2(i,j)
1325  vicen(i,j,n2) = vicen(i,j,n2) + fvol(i,j) *virdg(i,j)
1326  vsnon(i,j,n2) = vsnon(i,j,n2) &
1327  + fvol(i,j)*vsrdg(i,j)*fsnowrdg
1328  esnon(i,j,n2) = esnon(i,j,n2) &
1329  + fvol(i,j)*esrdg(i,j)*fsnowrdg
1330 
1331  enddo
1332 
1333  !-----------------------------------------------------------------
1334  ! Transfer ice energy to category n2
1335  !-----------------------------------------------------------------
1336  do k = 1, nilyr
1337 !DIR$ CONCURRENT !Cray
1338 !cdir nodep !NEC
1339 !ocl novrec !Fujitsu
1340  do ij = 1, icells
1341  i = indxi(ij)
1342  j = indxj(ij)
1343  eicen(i,j,ilyr1(n2)+k-1) = eicen(i,j,ilyr1(n2)+k-1) &
1344  + fvol(i,j)*eirdg(i,j,k)
1345  enddo ! ij
1346  enddo ! k
1347 
1348  enddo ! n2 (new ridges)
1349  enddo ! n1 (ridging categories)
1350 
1351  !-----------------------------------------------------------------
1352  ! Check volume and energy conservation
1353  !-----------------------------------------------------------------
1354 
1355  if (l_conservation_check) then
1356 
1357  call column_sum (ncat, vicen, vice_final)
1358  fieldid = 'vice, ridging'
1359  call column_conservation_check (vice_init, vice_final, &
1360  puny, fieldid)
1361 
1362  call column_sum (ntilay, eicen, eice_final)
1363  fieldid = 'eice, ridging'
1364  call column_conservation_check (eice_init, eice_final, &
1365  puny*lfresh*rhoi, fieldid)
1366 
1367  endif
1368 
1369  end subroutine ridge_shift
1370 
1371 !=======================================================================
1372 !BOP
1373 !
1374 ! !ROUTINE: asum_ridging - find total fractional area
1375 !
1376 ! !DESCRIPTION:
1377 !
1378 ! Find the total area of ice plus open water in each grid cell.
1379 !
1380 ! This is similar to the aggregate_area subroutine except that the
1381 ! total area can be greater than 1, so the open water area is
1382 ! included in the sum instead of being computed as a residual.
1383 !
1384 ! !REVISION HISTORY:
1385 !
1386 ! author William H. Lipscomb, LANL
1387 !
1388 ! !INTERFACE:
1389 !
1390  subroutine asum_ridging
1392 ! !USES:
1393 !
1394 ! !INPUT/OUTPUT PARAMETERS:
1395 !
1396 !EOP
1397 !
1398  integer (kind=int_kind) :: i, j, ni
1399 
1400  !-----------------------------------------------------------------
1401  ! open water
1402  !-----------------------------------------------------------------
1403 
1404  do j = jlo, jhi
1405  do i = ilo, ihi
1406  asum(i,j) = aice0(i,j)
1407  enddo
1408  enddo
1409 
1410  !-----------------------------------------------------------------
1411  ! ice categories
1412  !-----------------------------------------------------------------
1413 
1414  do ni = 1, ncat
1415 !DIR$ CONCURRENT !Cray
1416 !cdir nodep !NEC
1417 !ocl novrec !Fujitsu
1418  do j = jlo, jhi
1419  do i = ilo, ihi
1420  asum(i,j) = asum(i,j) + aicen(i,j,ni)
1421  enddo ! i
1422  enddo ! j
1423  enddo ! ni
1424 
1425  end subroutine asum_ridging
1426 
1427 !=======================================================================
1428 
1429  end module ice_mechred
1430 
1431 !=======================================================================
real(kind=dbl_kind), parameter gstar
Definition: ice_mechred.f90:89
subroutine ice_strength(kstrngth)
real(kind=dbl_kind), dimension(:,:,:), allocatable, save krdg
integer(kind=int_kind), parameter nilyr
subroutine column_sum(nsum, xin, xout)
Definition: ice_itd.f90:1190
logical(kind=log_kind), parameter l_conservation_check
real(kind=dbl_kind), dimension(:,:,:), allocatable, target, save esnon
Definition: ice_state.f90:97
subroutine ridge_prep
real(kind=dbl_kind), dimension(:,:,:), allocatable, save apartic
real(kind=dbl_kind), dimension(:,:), allocatable, save dvirdgdt
integer(kind=int_kind) ihi
Definition: ice_domain.f90:101
real(kind=dbl_kind), parameter c0i
real(kind=dbl_kind), parameter rhos
real(kind=dbl_kind), parameter lfresh
integer(kind=int_kind) krdg_partic
Definition: ice_mechred.f90:81
real(kind=dbl_kind), dimension(:,:), allocatable, save fhnet_hist
Definition: ice_flux.f90:140
real(kind=dbl_kind), parameter hstar
Definition: ice_mechred.f90:89
subroutine column_conservation_check(x1, x2, max_err, fieldid)
Definition: ice_itd.f90:1243
real(kind=dbl_kind), dimension(:,:), allocatable, save opening
real(kind=dbl_kind), parameter maxraft
Definition: ice_mechred.f90:89
real(kind=dbl_kind), dimension(:,:), allocatable, save dardg1dt
real(kind=dbl_kind), parameter c4i
real(kind=dbl_kind), dimension(:,:), allocatable, save fresh
Definition: ice_flux.f90:120
integer(kind=int_kind) krdg_redist
Definition: ice_mechred.f90:81
real(kind=dbl_kind), parameter cs
Definition: ice_mechred.f90:89
real(kind=dbl_kind), parameter p25
real(kind=dbl_kind), dimension(:,:), allocatable, save aksum
real(kind=dbl_kind), parameter c20
integer(kind=int_kind) jlo
Definition: ice_domain.f90:101
real(kind=dbl_kind), parameter astar
Definition: ice_mechred.f90:89
real(kind=dbl_kind), parameter c25
real(kind=dbl_kind), parameter cf
Definition: ice_mechred.f90:89
real(kind=dbl_kind), parameter cp
Definition: ice_mechred.f90:89
real(kind=dbl_kind), parameter cstar
Definition: ice_mechred.f90:89
integer(kind=int_kind) ilo
Definition: ice_domain.f90:101
real(kind=dbl_kind), parameter p5
real(kind=dbl_kind), parameter puny
real(kind=dbl_kind), dimension(:,:,:), allocatable, save hrmin
integer(kind=int_kind) jhi
Definition: ice_domain.f90:101
real(kind=dbl_kind), dimension(:,:), allocatable worka
Definition: ice_work.f90:61
real(kind=dbl_kind), parameter rhow
real(kind=dbl_kind), dimension(:,:,:), allocatable, target, save vicen
Definition: ice_state.f90:97
real(kind=dbl_kind) dyn_dt
real(kind=dbl_kind), dimension(:,:), allocatable, target, save aice
Definition: ice_state.f90:82
real(kind=dbl_kind), dimension(:,:), allocatable, save fresh_hist
Definition: ice_flux.f90:140
real(kind=dbl_kind), dimension(:,:,:), allocatable, target, save eicen
Definition: ice_state.f90:108
real(kind=dbl_kind), dimension(:,:), allocatable, target, save aice0
Definition: ice_state.f90:105
integer(kind=int_kind), parameter ncat
real(kind=dbl_kind), parameter mu_rdg
Definition: ice_mechred.f90:89
real(kind=dbl_kind), parameter c2i
real(kind=dbl_kind), dimension(:,:,:), allocatable, target, save aicen
Definition: ice_state.f90:97
integer(kind=int_kind), save my_task
Definition: ice_domain.f90:95
real(kind=dbl_kind), dimension(0:ncat) hin_max
Definition: ice_itd.f90:74
subroutine ridge_ice(Delta, divu)
real(kind=dbl_kind), dimension(:,:,:), allocatable, save hrexp
real(kind=dbl_kind), dimension(:,:), allocatable, target, save vice
Definition: ice_state.f90:82
real(kind=dbl_kind), parameter pstar
Definition: ice_mechred.f90:89
real(kind=dbl_kind), parameter gravit
real(kind=dbl_kind), parameter c1i
subroutine asum_ridging
subroutine ridge_shift(opning, closing_gross, msnow_mlt, esnow_mlt)
real(kind=dbl_kind), dimension(:,:), allocatable, save asum
real(kind=dbl_kind), parameter rhoi
integer(kind=int_kind), parameter ntilay
real(kind=dbl_kind), parameter p333
real(kind=dbl_kind), parameter fsnowrdg
Definition: ice_mechred.f90:89
real(kind=dbl_kind), parameter p15
integer(kind=int_kind), dimension(ncat) ilyr1
Definition: ice_itd.f90:62
real(kind=dbl_kind), dimension(:,:), allocatable, save dardg2dt
integer(kind=int_kind) istep1
real(kind=dbl_kind), dimension(:,:), allocatable, save strength
Definition: ice_state.f90:120
subroutine init_mechred
real(kind=dbl_kind), dimension(:,:), allocatable, save fhnet
Definition: ice_flux.f90:120
real(kind=dbl_kind), dimension(:,:,:), allocatable, target, save vsnon
Definition: ice_state.f90:97
integer(kind=int_kind) kstrength
Definition: ice_mechred.f90:81
real(kind=dbl_kind), dimension(:,:,:), allocatable, save hrmax