196
197
198
199
200 integer, intent(in) :: ng, tile, model
201 integer, intent(in) :: LBi, UBi, LBj, UBj
202 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
203 integer, intent(in) :: nrhs, liold, linew
204
205#ifdef ASSUMED_SHAPE
206# ifdef MASKING
207 real(r8), intent(in) :: rmask(LBi:,LBj:)
208# endif
209# ifdef WET_DRY
210 real(r8), intent(in) :: rmask_wet(LBi:,LBj:)
211# endif
212# ifdef ICESHELF
213 real(r8), intent(in) :: zice(LBi:,LBj:)
214# endif
215# ifdef ICE_SHOREFAST
216 real(r8), intent(in) :: h(LBi:,LBj:)
217 real(r8), intent(in) :: Zt_avg1(LBi:,LBj:)
218# endif
219# ifdef AICLM_NUDGING
220 real(r8), intent(in) :: aiclm(LBi:,LBj:)
221 real(r8), intent(in) :: hiclm(LBi:,LBj:)
222 real(r8), intent(in) :: AInudgcof(LBi:,LBj:)
223# endif
224 real(r8), intent(in) :: z_r(LBi:,LBj:,:)
225 real(r8), intent(in) :: z_w(LBi:,LBj:,0:)
226 real(r8), intent(in) :: t(LBi:,LBj:,:,:,:)
227 real(r8), intent(in) :: sustr(LBi:,LBj:)
228 real(r8), intent(in) :: svstr(LBi:,LBj:)
229 real(r8), intent(in) :: Qnet_ai(LBi:,LBj:)
230 real(r8), intent(in) :: Qnet_ao(LBi:,LBj:)
231 real(r8), intent(in) :: snow(LBi:,LBj:)
232 real(r8), intent(in) :: rain(LBi:,LBj:)
233 real(r8), intent(inout) :: stflx(LBi:,LBj:,:)
234 real(r8), intent(inout) :: Fi(LBi:,LBj:,:)
235 real(r8), intent(inout) :: Si(LBi:,LBj:,:,:)
236#else
237# ifdef MASKING
238 real(r8), intent(in) :: rmask(LBi:UBi,LBj:UBj)
239# endif
240# ifdef WET_DRY
241 real(r8), intent(in) :: rmask_wet(LBi:UBi,LBj:UBj)
242# endif
243# ifdef ICESHELF
244 real(r8), intent(in) :: zice(LBi:UBi,LBj:UBj)
245# endif
246# ifdef ICE_SHOREFAST
247 real(r8), intent(in) :: h(LBi:UBi,LBj:UBj)
248 real(r8), intent(in) :: Zt_avg1(LBi:UBi,LBj:UBj)
249# endif
250# ifdef AICLM_NUDGING
251 real(r8), intent(in) :: aiclm(LBi:UBi,LBj:UBj)
252 real(r8), intent(in) :: hiclm(LBi:UBi,LBj:UBj)
253 real(r8), intent(in) :: AInudgcof(LBi:UBi,LBj:UBj)
254# endif
255 real(r8), intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
256 real(r8), intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
257 real(r8), intent(in) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
258 real(r8), intent(in) :: sustr(LBi:UBi,LBj:UBj)
259 real(r8), intent(in) :: svstr(LBi:UBi,LBj:UBj)
260 real(r8), intent(in) :: Qnet_ai(LBi:UBi,LBj:UBj)
261 real(r8), intent(in) :: Qnet_ao(LBi:UBi,LBj:UBj)
262 real(r8), intent(in) :: snow(LBi:UBi,LBj:UBj)
263 real(r8), intent(in) :: rain(LBi:UBi,LBj:UBj)
264 real(r8), intent(inout) :: stflx(LBi:UBi,LBj:UBj,NT(ng))
265 real(r8), intent(inout) :: Fi(LBi:UBi,LBj:UBj,nIceF)
266 real(r8), intent(inout) :: Si(LBi:UBi,LBj:UBj,2,nIceS)
267#endif
268
269
270
271 logical :: IceCavity
272
273 integer :: i, j
274
275 real(r8), parameter :: AlphIc = 2.034_r8
276 real(r8), parameter :: AlphSn = 0.31_r8
277 real(r8), parameter :: Cp_i = 2093.0_r8
278 real(r8), parameter :: Cp_w = 3990.0_r8
279 real(r8), parameter :: eps = 1.0e-4_r8
280 real(r8), parameter :: frln = -0.0543_r8
281 real(r8), parameter :: hfus = 3.347e+5_r8
282 real(r8), parameter :: kappa = 0.4_r8
283 real(r8), parameter :: nu = 1.8e-6_r8
284 real(r8), parameter :: prs = 2432.0_r8
285 real(r8), parameter :: prt = 13.0_r8
286 real(r8), parameter :: RhoCpr = 0.2442754e-6_r8
287 real(r8), parameter :: RhoSW = 1026.0_r8
288 real(r8), parameter :: sice_ref = 3.2_r8
289 real(r8), parameter :: tpr = 0.85_r8
290 real(r8), parameter :: ykf = 3.14
291 real(r8), parameter :: z0ii = 0.02_r8
292
293 real(r8) :: cff, cff1, cff2, cff3
294 real(r8) :: d1, d2i, d3, dztop, fac_shflx
295 real(r8) :: ai_tmp, corfac, cot, delta_mi
296 real(r8) :: hicehinv, hstar, mi_old, phi
297 real(r8) :: Qsur, rno, termt, terms, tfrz, tfz
298 real(r8) :: xwai, xtot, z0, zdz0, xmelt
299#ifdef ICE_SHOREFAST
300 real(r8) :: clear, fac_sf, hh
301#endif
302
303 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: alph
304 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: brnfr
305 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: b2d
306 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: chs
307 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: cht
308 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Coa
309 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: hfus1
310 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ice_thick
311 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Qai
312 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Qio
313 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Qi2
314 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: salt_top
315 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: sice
316 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: snow_thick
317 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: temp_top
318 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: t2
319 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: utau
320 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ws
321 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: wsm
322
323#include "set_bounds.h"
324
325
326
327
328
329
330
331
332
333 d1 =airrho(ng)*spec_heat_air*trans_coeff
334 d2i=airrho(ng)*sublimation*trans_coeff
335 d3 =stefbo*ice_emiss
336
337
338
339
340 DO j=jstr,jend
341 DO i=istr,iend
342 temp_top(i,j)=t(i,j,n(ng),nrhs,itemp)
343 salt_top(i,j)=t(i,j,n(ng),nrhs,isalt)
344 salt_top(i,j)=min(max(0.0_r8, salt_top(i,j)), 40.0_r8)
345 END DO
346 END DO
347
348
349
350 DO j=jstr,jend
351 DO i=istr,iend
352 utau(i,j)=sqrt(sqrt((0.5_r8*(sustr(i ,j)+ &
353 sustr(i+1,j)))**2+ &
354 & (0.5_r8*(svstr(i,j )+ &
355 & svstr(i,j+1)))**2))
356 utau(i,j)=max(utau(i,j), 1.0e-4_r8)
357 END DO
358 END DO
359
360
361
362
363 DO j=jstr,jend
364 DO i=istr,iend
365 sice(i,j)=min(sice_ref, salt_top(i,j))
366 ice_thick(i,j)=0.05_r8+ &
367 & si(i,j,linew,ishice)/ &
368 & (si(i,j,linew,isaice)+eps)
369 snow_thick(i,j)=si(i,j,linew,ishsno)/ &
370 (si(i,j,linew,isaice)+eps)
371 brnfr(i,j)=frln*sice(i,j)/(si(i,j,linew,istice)-eps)
372 brnfr(i,j)=min(brnfr(i,j),0.2_r8)
373 brnfr(i,j)=max(brnfr(i,j),0.0_r8)
374 alph(i,j)=alphic*max(1.0_r8-1.2_r8*brnfr(i,j), 0.25_r8)
375 cff=(si(i,j,linew,ishice)/1.0_r8)**2
376 corfac=1.0_r8/(0.5_r8*(1.0_r8+exp(-cff)))
377 alph(i,j)=alph(i,j)*corfac
378 coa(i,j)=2.0_r8*alph(i,j)*snow_thick(i,j)/ &
379 & (alphsn*ice_thick(i,j))
380 END DO
381 END DO
382
383
384
385
386
387 DO j=jstr,jend
388 DO i=istr,iend
389
390
391
392 b2d(i,j)=2.0_r8*alph(i,j)/(ice_thick(i,j)*(1.0_r8+coa(i,j)))
393 fi(i,j,icqcon)=fi(i,j,icqcon)+ &
394 & b2d(i,j)
395
396
397
398
399 IF (si(i,j,linew,isaice).gt.min_ai(ng)) THEN
400 fi(i,j,icqrhs)=fi(i,j,icqrhs)+ &
401 & b2d(i,j)*(si(i,j,linew,istice)+273.15_r8)
402
403
404
405 fi(i,j,icisst)=(fi(i,j,icqrhs)/fi(i,j,icqcon))-273.15_r8
406
407
408
409
410 fi(i,j,icisst)=min(max(fi(i,j,icisst),-45.0_r8), 0.0_r8)
411 ELSE
412 fi(i,j,icisst)=temp_top(i,j)
413 END IF
414 END DO
415 END DO
416
417
418
419 DO j=jstr,jend
420 DO i=istr,iend
421
422
423
424
425
426
427
428 IF (si(i,j,linew,isaice).gt.min_ai(ng)) THEN
429 cot=-frln*sice(i,j)*hfus/ &
430 & (min(si(i,j,linew,istice), frln*sice_ref))**2+cp_i
431 cff1=icerho(ng)*cot*ice_thick(i,j)**2
432 cff2=fi(i,j,icisst)-(2.0_r8+coa(i,j))*si(i,j,linew,istice)
433 cff3=1.0_r8+coa(i,j)
434 si(i,j,linew,istice)=si(i,j,linew,istice)+ &
435 & dtice(ng)* &
436 & (2.0_r8*alph(i,j)/cff1* &
437 & (fi(i,j,ict0mk)+cff2/cff3))
438 si(i,j,linew,istice)=max(si(i,j,linew,istice), -35.0_r8)
439
440
441
442
443
444
445
446
447
448
449 si(i,j,linew,istice)=min(si(i,j,linew,istice), &
450 & frln*sice_ref)
451 si(i,j,linew,istice)=min(si(i,j,linew,istice), &
452 & max(fi(i,j,icisst), &
453 & fi(i,j,ict0mk)))
454 ELSE
455 si(i,j,linew,istice)=temp_top(i,j)
456 END IF
457 END DO
458 END DO
459
460
461
462 DO j=jstr,jend
463 DO i=istr,iend
464 IF (si(i,j,linew,isaice).gt.min_ai(ng)) THEN
465 hicehinv=1.0_r8/(0.5_r8*ice_thick(i,j))
466 t2(i,j) =(fi(i,j,icisst)+coa(i,j)*si(i,j,linew,istice))/ &
467 & (1.0_r8+coa(i,j))
468 qi2(i,j)=alph(i,j)* &
469 & (si(i,j,linew,istice)-t2(i,j))*hicehinv
470 qio(i,j)=alph(i,j)* &
471 & (fi(i,j,ict0mk)-si(i,j,linew,istice))*hicehinv
472 END IF
473 qai(i,j)=qnet_ai(i,j)
474 END DO
475 END DO
476
477
478
479 DO j = jstr,jend
480 DO i = istr,iend
481 IF (si(i,j,linew,isaice).le.min_ai(ng)) THEN
482 fi(i,j,icisst)=fi(i,j,ict0mk)
483 t2(i,j)=fi(i,j,ict0mk)
484 si(i,j,linew,istice)=-2.0_r8
485#ifdef MASKING
486 fi(i,j,icisst)=fi(i,j,icisst)*rmask(i,j)
487 t2(i,j)=t2(i,j)*rmask(i,j)
488 si(i,j,linew,istice)=si(i,j,linew,istice)*rmask(i,j)
489# ifdef WET_DRY
490 fi(i,j,icisst)=fi(i,j,icisst)*rmask_wet(i,j)
491 t2(i,j)=t2(i,j)*rmask_wet(i,j)
492 si(i,j,linew,istice)=si(i,j,linew,istice)*rmask_wet(i,j)
493# endif
494#endif
495#ifdef ICESHELF
496 IF (zice(i,j).ne.0.0_r8) THEN
497 fi(i,j,icisst)=0.0_r8
498 t2(i,j)=0.0_r8
499 si(i,j,linew,istice)=0.0_r8
500 END IF
501#endif
502 qi2(i,j)=0.0_r8
503 qai(i,j)=0.0_r8
504 qio(i,j)=0.0_r8
505 si(i,j,linew,ishsno)=0.0_r8
506 si(i,j,linew,ishmel)=0.0_r8
507 END IF
508 END DO
509 END DO
510
511
512
513
514
515
516
517 DO j=jstr,jend
518 DO i=istr,iend
519 ws(i,j)=max(snow(i,j), 0.0_r8)
520 END DO
521 END DO
522
523
524
525 DO j=jstr,jend
526 DO i=istr,iend
527 tfrz=frln*sice(i,j)
528 wsm(i,j)=0.0_r8
529 fi(i,j,icw_ai)=0.0_r8
530 fi(i,j,icw_ro)=0.0_r8
531
532 IF (si(i,j,linew,isaice).gt.min_ai(ng)) THEN
533 cff=1.0_r8-brnfr(i,j)
534 hfus1(i,j)=hfus*cff+ &
535 & fi(i,j,icisst)*cp_w- &
536 & (cff*cp_i+brnfr(i,j)*cp_w)*si(i,j,linew,istice)
537 qai(i,j)=qnet_ai(i,j)
538 qi2(i,j)=b2d(i,j)*(si(i,j,linew,istice)-fi(i,j,icisst))
539
540 IF ((si(i,j,linew,ishsno).le.eps).and. &
541 & (si(i,j,linew,ishmel).le.eps)) THEN
542 qsur=-(qai(i,j)-qi2(i,j))/(hfus1(i,j)*rhosw)
543 ELSE IF ((si(i,j,linew,ishsno).le.eps).and. &
544 & (si(i,j,linew,ishmel).gt.eps)) THEN
545 qsur=-(qai(i,j)-qi2(i,j))/(hfus1(i,j)*1003.1_r8)
546 ELSE
547 qsur=-(qai(i,j)-qi2(i,j))/(hfus*snowwetrho(ng))
548 END IF
549
550 IF ((si(i,j,linew,ishsno).gt.eps).and. &
551 & (fi(i,j,icisst).ge.0.0_r8)) THEN
552 si(i,j,linew,ishsno)=si(i,j,linew,ishsno)- &
553 & si(i,j,linew,isaice)* &
554 & max(qsur, 0.0_r8)*dtice(ng)
555 si(i,j,linew,ishmel)=si(i,j,linew,ishmel)+ &
556 & si(i,j,linew,isaice)* &
557 & max(qsur, 0.0_r8)* &
558 & snowwetrho(ng)/rhosw*dtice(ng)
559 ELSE IF ((si(i,j,linew,ishmel).gt.eps).and. &
560 & (fi(i,j,icisst).le.tfrz)) THEN
561 fi(i,j,icw_ai)=min(qsur, 0.0_r8)
562 si(i,j,linew,ishmel)=si(i,j,linew,ishmel)+ &
563 & si(i,j,linew,isaice)* &
564 & min(qsur, 0.0_r8)*dtice(ng)
565 ELSE IF ((si(i,j,linew,ishsno).le.eps).and. &
566 & (si(i,j,linew,ishmel).ge.eps).and. &
567 & (fi(i,j,icisst).gt.tfrz)) THEN
568 fi(i,j,icw_ai)=max(qsur, 0.0_r8)
569 si(i,j,linew,ishmel)=si(i,j,linew,ishmel)+ &
570 & si(i,j,linew,isaice)* &
571 & max(qsur, 0.0_r8)*dtice(ng)
572 ELSE IF ((si(i,j,linew,ishsno).lt.eps).and. &
573 & (si(i,j,linew,ishmel).lt.eps).and. &
574 & (fi(i,j,icisst).gt.tfrz)) THEN
575 fi(i,j,icw_ai)=max(qsur, 0.0_r8)
576 si(i,j,linew,ishmel)=si(i,j,linew,ishmel)+ &
577 & si(i,j,linew,isaice)* &
578 & max(qsur, 0.0_r8)*dtice(ng)
579 END IF
580
581 IF (rain(i,j).le.0.0_r8) THEN
582 si(i,j,linew,ishsno)=si(i,j,linew,ishsno)+ &
583 & si(i,j,linew,isaice)* &
584 & ws(i,j)*dtice(ng)
585 ELSE IF ((si(i,j,linew,ishsno).gt.0.0_r8).and. &
586 & (si(i,j,linew,ishmel).eq.0.0_r8)) THEN
587 si(i,j,linew,ishsno)=max(0.0_r8, si(i,j,linew,ishsno)- &
588 & si(i,j,linew,isaice)*rain(i,j)/ &
589 & snowdryrho(ng))
590 fi(i,j,icw_ai)=fi(i,j,icw_ai)- &
591 & 2.0_r8*si(i,j,linew,isaice)* &
592 & rain(i,j)/icerho(ng)
593 ELSE IF ((si(i,j,linew,ishsno).gt.0.0_r8).and. &
594 & (si(i,j,linew,ishmel).gt.0.0_r8)) THEN
595 si(i,j,linew,ishsno)=max(0.0_r8, si(i,j,linew,ishsno)- &
596 & 0.5_r8*si(i,j,linew,isaice)* &
597 & rain(i,j)/snowdryrho(ng))
598 fi(i,j,icw_ai)=fi(i,j,icw_ai)- &
599 & 0.5_r8*si(i,j,linew,isaice)* &
600 & rain(i,j)/icerho(ng)
601 si(i,j,linew,ishmel)=si(i,j,linew,ishmel)+ &
602 & si(i,j,linew,isaice)* &
603 & 0.5_r8*rain(i,j)/rhosw*dtice(ng)
604 ELSE IF (si(i,j,linew,ishmel).gt.0.0_r8) THEN
605 si(i,j,linew,ishmel)=si(i,j,linew,ishmel)+ &
606 & si(i,j,linew,isaice)* &
607 & rain(i,j)/rhosw*dtice(ng)
608 ELSE
609 fi(i,j,icw_ai)=fi(i,j,icw_ai)- &
610 & si(i,j,linew,isaice)*rain(i,j)/icerho(ng)
611 END IF
612
613
614
615
616 IF (si(i,j,linew,ishmel).gt. &
617 min(max_hmelt(ng), si(i,j,linew,ishice))) THEN
618 fi(i,j,icw_ro)=(si(i,j,linew,ishmel)- &
619 & min(max_hmelt(ng), &
620 & si(i,j,linew,ishice)))/dtice(ng)
621 si(i,j,linew,ishmel)=min(max_hmelt(ng), &
622 & si(i,j,linew,ishice))
623 END IF
624 END IF
625 END DO
626 END DO
627
628
629
630
631
632
633
634
635 DO j=jstr,jend
636 DO i=istr,iend
637 z0=max(z0ii*ice_thick(i,j), 0.01_r8)
638 z0=min(z0, 0.1_r8)
639 dztop=z_w(i,j,n(ng))-z_r(i,j,n(ng))
640 zdz0=dztop/z0
641 zdz0=max(zdz0, 3.0_r8)
642 rno=utau(i,j)*0.09_r8/nu
643 termt=ykf*sqrt(rno)*prt**0.666667_r8
644 terms=ykf*sqrt(rno)*prs**0.666667_r8
645 cht(i,j)=utau(i,j)/(tpr*(log(zdz0)/kappa+termt))
646 chs(i,j)=utau(i,j)/(tpr*(log(zdz0)/kappa+terms))
647 END DO
648 END DO
649
650
651
652 DO j=jstr,jend
653 DO i=istr,iend
654 tfz=frln*salt_top(i,j)
655 fi(i,j,icw_ao)=0.0_r8
656 fi(i,j,icw_io)=0.0_r8
657 xwai=max(0.0_r8, fi(i,j,icw_ai))
658 cff=1.0_r8-brnfr(i,j)
659 hfus1(i,j)=hfus*cff+ &
660 & fi(i,j,ict0mk)*cp_w- &
661 & (cff*cp_i+brnfr(i,j)*cp_w)*si(i,j,linew,istice)
662 IF (((temp_top(i,j).le.tfz).and.(qnet_ao(i,j).gt.0.0_r8)).or. &
663 & ((temp_top(i,j).ge.tfz).and.(qnet_ao(i,j).lt.0.0_r8).and. &
664 & (si(i,j,linew,isaice).gt.0.0_r8))) THEN
665 fi(i,j,icw_ao)=qnet_ao(i,j)/(hfus1(i,j)*rhosw)
666 END IF
667 IF ((si(i,j,linew,isaice).le.min_ai(ng)).or. &
668 & (si(i,j,linew,ishice).le.min_hi(ng))) THEN
669 fi(i,j,ics0mk)=salt_top(i,j)
670 fi(i,j,ict0mk)=temp_top(i,j)
671 fi(i,j,icw_ai)=0.0_r8
672 xtot=(1.0_r8-si(i,j,linew,isaice))*fi(i,j,icw_ao)
673 ELSE
674 fi(i,j,icw_io)=(qio(i,j)/rhosw+ &
675 & cp_w*cht(i,j)*(fi(i,j,ict0mk)- &
676 & temp_top(i,j)))/hfus1(i,j)
677 xtot=si(i,j,linew,isaice)*fi(i,j,icw_io)+ &
678 & (1.0_r8-si(i,j,linew,isaice))*fi(i,j,icw_ao)
679
680
681
682
683
684 fi(i,j,ics0mk)=(chs(i,j)*salt_top(i,j)+ &
685 & (xwai-fi(i,j,icw_io))*sice(i,j))/ &
686 & (chs(i,j)+xwai+ &
687 & fi(i,j,icw_ro)-fi(i,j,icw_io))
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725 fi(i,j,ics0mk)=max(fi(i,j,ics0mk), 0.0_r8)
726 fi(i,j,ics0mk)=min(fi(i,j,ics0mk), 40.0_r8)
727 fi(i,j,ict0mk)=frln*fi(i,j,ics0mk)
728 END IF
729
730
731
732 fac_shflx=1.0_r8
733#ifdef ICESHELF
734 icecavity=zice(i,j).ne.0.0_r8
735#else
736 icecavity=.false.
737#endif
738 IF (.not.icecavity) THEN
739 IF(si(i,j,linew,isaice).le.min_ai(ng)) THEN
740 stflx(i,j,itemp)=qnet_ao(i,j)*fac_shflx
741 ELSE
742#ifdef ICE_SHOREFAST
743 hh=h(i,j)+zt_avg1(i,j)
744 clear=hh-0.9_r8*si(i,j,liol,ishice)
745 clear=max(clear, 0.0_r8)
746 IF (clear.lt.1.5_r8) THEN
747 fac_sf=max(clear-0.5_r8, 0.0_r8)/1.0_r8
748 ELSE
749 fac_sf=1.0_r8
750 END IF
751 stflx(i,j,itemp)=(1.0_r8-si(i,j,linew,isaice))* &
752 & qnet_ao(i,j)*fac_shflx+ &
753 & (si(i,j,linew,isaice)*qio(i,j)- &
754 & xtot*hfus1(i,j))*fac_sf
755#else
756 stflx(i,j,itemp)=(1.0_r8-si(i,j,linew,isaice))* &
757 & qnet_ao(i,j)+ &
758 & si(i,j,linew,isaice)*qio(i,j)- &
759 & xtot*hfus1(i,j)*rhosw
760#endif
761 END IF
762
763
764
765 stflx(i,j,itemp)=-stflx(i,j,itemp)*rhocpr
766#ifdef MASKING
767 stflx(i,j,itemp)=stflx(i,j,itemp)*rmask(i,j)
768#endif
769
770
771
772#ifdef ICE_SHOREFAST
773 cff=min(max(fi(i,j,ics0mk), 0.0_r8), 60.0_r8)
774 stflx(i,j,isalt)=stflx(i,j,isalt)- &
775 & ((xtot-si(i,j,linew,isaice)*xwai)* &
776 & (sice(i,j)-cff)+ &
777 & si(i,j,linew,isaice)* &
778 & fi(i,j,icw_ro)*cff)*fac_sf
779#else
780 stflx(i,j,isalt)=stflx(i,j,isalt)+ &
781 & ((si(i,j,linew,isaice)* &
782 & (fi(i,j,icw_io)-fi(i,j,icw_ai))+ &
783 & (1.0_r8-si(i,j,linew,isaice))* &
784 & fi(i,j,icw_ao)+ &
785 & fi(i,j,icw_fr)))* &
786 & (salt_top(i,j)-sice(i,j))- &
787 & si(i,j,linew,isaice)* &
788 & (fi(i,j,icw_ro)-xwai)*salt_top(i,j)
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812#endif
813#ifdef MASKING
814 stflx(i,j,isalt)=stflx(i,j,isalt)*rmask(i,j)
815#endif
816#ifdef WET_DRY
817 stflx(i,j,isalt)=stflx(i,j,isalt)*rmask_wet(i,j)
818#endif
819
820
821
822 fi(i,j,iciomf)=xtot- &
823 & si(i,j,linew,isaice)*xwai- &
824 & si(i,j,linew,isaice)*fi(i,j,icw_ro)+ &
825 & fi(i,j,icw_fr)
826#ifdef MASKING
827 fi(i,j,iciomf)=fi(i,j,iciomf)*rmask(i,j)
828#endif
829#ifdef WET_DRY
830 fi(i,j,iciomf)=fi(i,j,iciomf)*rmask_wet(i,j)
831#endif
832 ELSE
833 fi(i,j,iciomf)=0.0_r8
834 END IF
835 END DO
836 END DO
837
838
839
840
841
842
843
844
845 DO j=jstr,jend
846 DO i=istr,iend
847 mi_old=si(i,j,linew,ishice)
848 phi=3.0_r8
849 IF (fi(i,j,icw_ao).lt. 0.0_r8) phi=0.5_r8
850 xmelt=min((fi(i,j,icw_io)-fi(i,j,icw_ai)), 0.0_r8)
851 si(i,j,linew,ishice)=si(i,j,linew,ishice)+ &
852 & dtice(ng)* &
853 & (si(i,j,linew,isaice)* &
854 & (fi(i,j,icw_io)-fi(i,j,icw_ai))+ &
855 & (1.0_r8-si(i,j,linew,isaice))* &
856 & fi(i,j,icw_ao)+fi(i,j,icw_fr))
857
858 ai_tmp=si(i,j,linew,isaice)
859 si(i,j,linew,isaice)=si(i,j,linew,isaice)+ &
860 & dtice(ng)* &
861 & (1.0_r8-si(i,j,linew,isaice))* &
862 & (phi*fi(i,j,icw_ao)+fi(i,j,icw_fr))
863 si(i,j,linew,isaice)= min(si(i,j,linew,isaice), max_ai(ng))
864 IF (si(i,j,linew,isaice).lt.ai_tmp) THEN
865 si(i,j,linew,ishsno)=si(i,j,linew,ishsno)* &
866 & si(i,j,linew,isaice)/max(ai_tmp, eps)
867 END IF
868
869#ifdef ICE_CONVSNOW
870
871
872
873
874
875 hstar=si(i,j,linew,ishsno)- &
876 & (rhosw-icerho(ng))*si(i,j,linew,ishice)/snowdryrho(ng)
877 IF (hstar.gt.0.0_r8) THEN
878 cff=hstar/rhosw
879 si(i,j,linew,ishsno)=si(i,j,linew,ishsno)- &
880 & icerho(ng)*cff
881 si(i,j,linew,ishice)=si(i,j,linew,ishice)+ &
882 & snowdryrho(ng)*cff
883 END IF
884#endif
885#ifdef AICLM_NUDGING
886 cff=ainudgcof(i,j)
887 si(i,j,linew,isaice)=si(i,j,linew,isaice)+ &
888 & dtice(ng)*cff* &
889 & (aiclm(i,j)-si(i,j,linew,isaice))
890 si(i,j,linew,ishice)=si(i,j,linew,ishice)+ &
891 & dtice(ng)*cff* &
892 & (hiclm(i,j)-si(i,j,linew,ishice))
893#endif
894
895
896
897
898 IF ((si(i,j,linew,isiage).le.0.0_r8).and. &
899 & (si(i,j,linew,ishice).gt.min_hi(ng))) THEN
900 si(i,j,linew,isiage)=dtice(ng)*sec2day
901 ELSE IF((si(i,j,linew,isiage).gt.0.0_r8).and. &
902 & (si(i,j,linew,ishice).gt.min_hi(ng))) THEN
903 delta_mi=min(max(si(i,j,linew,ishice)-mi_old, 0.0_r8)/ &
904 & si(i,j,linew,ishice), 1.0_r8)
905 si(i,j,linew,isiage)=si(i,j,linew,isiage)+ &
906 & dtice(ng)*sec2day- &
907 & si(i,j,linew,isiage)*delta_mi
908 ELSE
909 si(i,j,linew,isiage)=0.0_r8
910 ENDIF
911
912#ifdef MASKING
913 si(i,j,linew,isaice)=si(i,j,linew,isaice)*rmask(i,j)
914 si(i,j,linew,ishice)=si(i,j,linew,ishice)*rmask(i,j)
915#endif
916#ifdef WET_DRY
917
918
919#endif
920#ifdef ICESHELF
921 IF (zice(i,j).ne.0.0_r8) THEN
922 si(i,j,linew,isaice)=0.0_r8
923 si(i,j,linew,ishice)=0.0_r8
924 END IF
925#endif
926 END DO
927 END DO
928
929
930
931 DO j=jstr,jend
932 DO i=istr,iend
933 si(i,j,linew,isaice)=min(si(i,j,linew,isaice), max_ai(ng))
934 si(i,j,linew,isaice)=max(si(i,j,linew,isaice), 0.0_r8)
935 si(i,j,linew,ishice)=max(si(i,j,linew,ishice), 0.0_r8)
936 si(i,j,linew,ishsno)=max(si(i,j,linew,ishsno), 0.0_r8)
937 si(i,j,linew,ishmel)=max(si(i,j,linew,ishmel), 0.0_r8)
938 si(i,j,linew,istice)=max(si(i,j,linew,istice), -70.0_r8)
939 IF (si(i,j,linew,ishice).le.0.0_r8) &
940 & si(i,j,linew,isaice)=0.0_r8
941 IF (si(i,j,linew,isaice).le.0.0_r8) &
942 & si(i,j,linew,ishice)=0.0_r8
943 END DO
944 END DO
945
946
947
948
949
950 CALL bc_r2d_tile (ng, tile, &
951 & lbi, ubi, lbj, ubj, &
952 & fi(:,:,icisst))
953
954 CALL bc_r2d_tile (ng, tile, &
955 & lbi, ubi, lbj, ubj, &
956 & fi(:,:,icqcon))
957
958 CALL bc_r2d_tile (ng, tile, &
959 & lbi, ubi, lbj, ubj, &
960 & fi(:,:,icqrhs))
961
962 CALL bc_r2d_tile (ng, tile, &
963 & lbi, ubi, lbj, ubj, &
964 & stflx(:,:,isalt))
965
966 CALL bc_r2d_tile (ng, tile, &
967 & lbi, ubi, lbj, ubj, &
968 & stflx(:,:,itemp))
969
970 CALL ice_bc2d_tile (ng, tile, model, isaice, &
971 & lbi, ubi, lbj, ubj, &
972 & imins, imaxs, jmins, jmaxs, &
973 & liold, linew, &
974 & si(:,:,:,isuice), &
975 & si(:,:,:,isvice), &
976 & si(:,:,:,isaice), &
977 & lbc(:,ibice(isaice),ng))
978
979 CALL ice_bc2d_tile (ng, tile, model, ishice, &
980 & lbi, ubi, lbj, ubj, &
981 & imins, imaxs, jmins, jmaxs, &
982 & liold, linew, &
983 & si(:,:,:,isuice), &
984 & si(:,:,:,isvice), &
985 & si(:,:,:,ishice), &
986 & lbc(:,ibice(ishice),ng))
987
988 CALL ice_bc2d_tile (ng, tile, model, ishsno, &
989 & lbi, ubi, lbj, ubj, &
990 & imins, imaxs, jmins, jmaxs, &
991 & liold, linew, &
992 & si(:,:,:,isuice), &
993 & si(:,:,:,isvice), &
994 & si(:,:,:,ishsno), &
995 & lbc(:,ibice(ishsno),ng))
996
997 CALL ice_bc2d_tile (ng, tile, model, ishmel, &
998 & lbi, ubi, lbj, ubj, &
999 & imins, imaxs, jmins, jmaxs, &
1000 & liold, linew, &
1001 & si(:,:,:,isuice), &
1002 & si(:,:,:,isvice), &
1003 & si(:,:,:,ishmel), &
1004 & lbc(:,ibice(ishmel),ng))
1005
1006 CALL ice_bc2d_tile (ng, tile, model, isiage, &
1007 & lbi, ubi, lbj, ubj, &
1008 & imins, imaxs, jmins, jmaxs, &
1009 & liold, linew, &
1010 & si(:,:,:,isuice), &
1011 & si(:,:,:,isvice), &
1012 & si(:,:,:,isiage), &
1013 & lbc(:,ibice(isiage),ng))
1014
1015 CALL ice_tibc_tile (ng, tile, model, &
1016 & lbi, ubi, lbj, ubj, &
1017 & liold, linew, &
1018 & si(:,:,:,isuice), &
1019 & si(:,:,:,isvice), &
1020 & si(:,:,:,ishice), &
1021 & si(:,:,:,istice), &
1022 & si(:,:,:,isenth))
1023
1024 IF (ewperiodic(ng).or.nsperiodic(ng)) THEN
1025 CALL exchange_r2d_tile (ng, tile, &
1026 & lbi, ubi, lbj, ubj, &
1027 & si(:,:,linew,ishage))
1028
1029 CALL exchange_r2d_tile (ng, tile, &
1030 & lbi, ubi, lbj, ubj, &
1031 & si(:,:,linew,ishice))
1032
1033 CALL exchange_r2d_tile (ng, tile, &
1034 & lbi, ubi, lbj, ubj, &
1035 & si(:,:,linew,ishmel))
1036
1037 CALL exchange_r2d_tile (ng, tile, &
1038 & lbi, ubi, lbj, ubj, &
1039 & si(:,:,linew,ishsno))
1040
1041 CALL exchange_r2d_tile (ng, tile, &
1042 & lbi, ubi, lbj, ubj, &
1043 & si(:,:,linew,isaice))
1044
1045 CALL exchange_r2d_tile (ng, tile, &
1046 & lbi, ubi, lbj, ubj, &
1047 & si(:,:,linew,isiage))
1048
1049 CALL exchange_r2d_tile (ng, tile, &
1050 & lbi, ubi, lbj, ubj, &
1051 & si(:,:,linew,isenth))
1052
1053 CALL exchange_r2d_tile (ng, tile, &
1054 & lbi, ubi, lbj, ubj, &
1055 & si(:,:,linew,istice))
1056 END IF
1057
1058#ifdef DISTRIBUTE
1059
1060 CALL mp_exchange2d (ng, tile, model, 4, &
1061 & lbi, ubi, lbj, ubj, &
1062 & nghostpoints, ewperiodic(ng), nsperiodic(ng), &
1063 & si(:,:,linew,ishage), &
1064 & si(:,:,linew,ishice), &
1065 & si(:,:,linew,ishmel), &
1066 & si(:,:,linew,ishsno))
1067
1068 CALL mp_exchange2d (ng, tile, model, 4, &
1069 & lbi, ubi, lbj, ubj, &
1070 & nghostpoints, ewperiodic(ng), nsperiodic(ng), &
1071 & si(:,:,linew,isaice), &
1072 & si(:,:,linew,isiage), &
1073 & si(:,:,linew,isenth), &
1074 & si(:,:,linew,istice))
1075#endif
1076
1077 RETURN