462
463
468
469# ifdef DISTRIBUTE
471# endif
472
473
474
475 integer, intent(in) :: ng, tile, model
476 integer, intent(in) :: LBi, UBi, LBj, UBj, LBij, UBij
477 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
478
479# ifdef ASSUMED_SHAPE
480 real(r8), intent(in) :: h(LBi:,LBj:)
481 real(r8), intent(inout) :: ad_h(LBi:,LBj:)
482# ifdef ICESHELF
483 real(r8), intent(in) :: zice(LBi:,LBj:)
484# endif
485 real(r8), intent(out) :: ad_Hz_bry(LBij:,:,:)
486# else
487 real(r8), intent(in) :: h(LBi:UBi,LBj:UBj)
488 real(r8), intent(inout) :: ad_h(LBi:UBi,LBj:UBj)
489# ifdef ICESHELF
490 real(r8), intent(in) :: zice(LBi:UBi,LBj:UBj)
491# endif
492 real(r8), intent(out) :: ad_Hz_bry(LBij:UBij,N(ng),4)
493# endif
494
495
496
497 integer :: i, ibry, j, k
498
499 real(r8) :: cff_w, cff1_w, cff2_w
500 real(r8) :: hinv, hwater, z_w0
501 real(r8) :: ad_cff2_w, ad_hinv, ad_hwater, ad_z_w0
502 real(r8) :: adfac
503
504 real(r8), dimension(0:N(ng)) :: ad_Zw
505
506# include "set_bounds.h"
507
508
509
510
511
512 ad_cff2_w=0.0_r8
513 ad_z_w0=0.0_r8
514 ad_hinv=0.0_r8
515 ad_hwater=0.0_r8
516 ad_zw(0:
n(ng))=0.0_r8
517
518# ifdef DISTRIBUTE
519
520
521
522
523
524 DO ibry=1,4
525
526
527
528
529
530
532 & lbij, ubij, 1,
n(ng), &
535 & ad_hz_bry(:,:,ibry))
536 END DO
537# endif
538
539
540
541
542
543
544
545
546
547
548
549
551
553 &
domain(ng)%Northern_Edge(tile))
THEN
555 DO i=istrt,iendt
556 hwater=h(i,j)
557# ifdef ICESHELF
558 hwater=hwater-abs(zice(i,j))
559# endif
560 hinv=1.0_r8/hwater
564 z_w0=cff_w+cff1_w*hwater
565
566
567 ad_zw(k-1)=ad_zw(k-1)-ad_hz_bry(i,k,
inorth)
568 ad_zw(k )=ad_zw(k )+ad_hz_bry(i,k,
inorth)
569 ad_hz_bry(i,k,
inorth)=0.0_r8
570
571
572
573
574
575
576 adfac=
boundary(ng)%zeta_north(i)*ad_zw(k)
577 ad_z_w0=ad_z_w0+hinv*adfac+ad_zw(k)
578 ad_hinv=ad_hinv+z_w0*adfac
580 & ad_zeta_north(i)+ &
581 & (1.0_r8+z_w0*hinv)*ad_zw(k)
582 ad_zw(k)=0.0_r8
583
584
585 ad_hwater=ad_hwater+cff1_w*ad_z_w0
586 ad_z_w0=0.0_r8
587 END DO
588
589
590 ad_h(i,j)=ad_h(i,j)-ad_zw(0)
591 ad_zw(0)=0.0_r8
592
593
594 ad_hwater=ad_hwater-hinv*hinv*ad_hinv
595 ad_hinv=0.0_r8
596
597
598 ad_h(i,j)=ad_h(i,j)+ad_hwater
599 ad_hwater=0.0_r8
600 END DO
601 END IF
602
604 &
domain(ng)%Southern_Edge(tile))
THEN
606 DO i=istrt,iendt
607 hwater=h(i,j)
608# ifdef ICESHELF
609 hwater=hwater-abs(zice(i,j))
610# endif
611 hinv=1.0_r8/hwater
615 z_w0=cff_w+cff1_w*hwater
616
617
618 ad_zw(k-1)=ad_zw(k-1)-ad_hz_bry(i,k,
isouth)
619 ad_zw(k )=ad_zw(k )+ad_hz_bry(i,k,
isouth)
620 ad_hz_bry(i,k,
isouth)=0.0_r8
621
622
623
624
625
626
627 adfac=
boundary(ng)%zeta_south(i)*ad_zw(k)
628 ad_z_w0=ad_z_w0+hinv*adfac+ad_zw(k)
629 ad_hinv=ad_hinv+z_w0*adfac
631 & ad_zeta_south(i)+ &
632 & (1.0_r8+z_w0*hinv)*ad_zw(k)
633 ad_zw(k)=0.0_r8
634
635
636 ad_hwater=ad_hwater+cff1_w*ad_z_w0
637 ad_z_w0=0.0_r8
638 END DO
639
640
641 ad_h(i,j)=ad_h(i,j)-ad_zw(0)
642 ad_zw(0)=0.0_r8
643
644
645 ad_hwater=ad_hwater-hinv*hinv*ad_hinv
646 ad_hinv=0.0_r8
647
648
649 ad_h(i,j)=ad_h(i,j)+ad_hwater
650 ad_hwater=0.0_r8
651 END DO
652 END IF
653
655 &
domain(ng)%Eastern_Edge(tile))
THEN
657 DO j=jstrt,jendt
658 hwater=h(i,j)
659# ifdef ICESHELF
660 hwater=hwater-abs(zice(i,j))
661# endif
662 hinv=1.0_r8/hwater
666 z_w0=cff_w+cff1_w*hwater
667
668
669 ad_zw(k-1)=ad_zw(k-1)-ad_hz_bry(i,k,
ieast)
670 ad_zw(k )=ad_zw(k )+ad_hz_bry(i,k,
ieast)
671 ad_hz_bry(i,k,
ieast)=0.0_r8
672
673
674
675
676
677
678 adfac=
boundary(ng)%zeta_east(j)*ad_zw(k)
679 ad_z_w0=ad_z_w0+hinv*adfac+ad_zw(k)
680 ad_hinv=ad_hinv+z_w0*adfac
682 & ad_zeta_east(j)+ &
683 & (1.0_r8+z_w0*hinv)*ad_zw(k)
684 ad_zw(k)=0.0_r8
685
686
687 ad_hwater=ad_hwater+cff1_w*ad_z_w0
688 ad_z_w0=0.0_r8
689 END DO
690
691
692 ad_h(i,j)=ad_h(i,j)-ad_zw(0)
693 ad_zw(0)=0.0_r8
694
695
696 ad_hwater=ad_hwater-hinv*hinv*ad_hinv
697 ad_hinv=0.0_r8
698
699
700 ad_h(i,j)=ad_h(i,j)+ad_hwater
701 ad_hwater=0.0_r8
702 END DO
703 END IF
704
706 &
domain(ng)%Western_Edge(tile))
THEN
708 DO j=jstrt,jendt
709 hwater=h(i,j)
710# ifdef ICESHELF
711 hwater=hwater-abs(zice(i,j))
712# endif
713 hinv=1.0_r8/hwater
717 z_w0=cff_w+cff1_w*hwater
718
719
720 ad_zw(k-1)=ad_zw(k-1)-ad_hz_bry(i,k,
iwest)
721 ad_zw(k )=ad_zw(k )+ad_hz_bry(i,k,
iwest)
722 ad_hz_bry(i,k,
iwest)=0.0_r8
723
724
725
726
727
728
729 adfac=
boundary(ng)%zeta_west(j)*ad_zw(k)
730 ad_z_w0=ad_z_w0+hinv*adfac+ad_zw(k)
731 ad_hinv=ad_hinv+z_w0*adfac
733 & ad_zeta_west(j)+ &
734 & (1.0_r8+z_w0*hinv)*ad_zw(k)
735 ad_zw(k)=0.0_r8
736
737
738 ad_hwater=ad_hwater+cff1_w*ad_z_w0
739 ad_z_w0=0.0_r8
740 END DO
741
742
743 ad_h(i,j)=ad_h(i,j)-ad_zw(0)
744 ad_zw(0)=0.0_r8
745
746
747 ad_hwater=ad_hwater-hinv*hinv*ad_hinv
748 ad_hinv=0.0_r8
749
750
751 ad_h(i,j)=ad_h(i,j)+ad_hwater
752 ad_hwater=0.0_r8
753 END DO
754 END IF
755
756
757
758
759
760
761
762
763
764
765
766
768
770 &
domain(ng)%Northern_Edge(tile))
THEN
772 DO i=istrt,iendt
773 hwater=h(i,j)
774# ifdef ICESHELF
775 hwater=hwater-abs(zice(i,j))
776# endif
777 hinv=1.0_r8/(
hc(ng)+hwater)
781 cff2_w=(cff_w+cff1_w*hwater)*hinv
782
783
784 ad_zw(k-1)=ad_zw(k-1)-ad_hz_bry(i,k,
inorth)
785 ad_zw(k )=ad_zw(k )+ad_hz_bry(i,k,
inorth)
786 ad_hz_bry(i,k,
inorth)=0.0_r8
787
788
789
790
791
792
793 adfac=cff2_w*ad_zw(k)
794 ad_cff2_w=ad_cff2_w+ &
795 & (
boundary(ng)%zeta_north(i)+hwater)*ad_zw(k)
796 ad_hwater=ad_hwater+adfac
798 & ad_zeta_north(i)+ &
799 & ad_zw(k)+adfac
800 ad_zw(k)=0.0_r8
801
802
803
804 ad_hinv=ad_hinv+ &
805 & (cff_w+cff1_w*hwater)*ad_cff2_w
806 ad_hwater=ad_hwater+ &
807 & cff1_w*hinv*ad_cff2_w
808 ad_cff2_w=0.0_r8
809 END DO
810
811
812 ad_h(i,j)=ad_h(i,j)-ad_zw(0)
813 ad_zw(0)=0.0_r8
814
815
816 ad_hwater=ad_hwater-hinv*hinv*ad_hinv
817 ad_hinv=0.0_r8
818
819
820 ad_h(i,j)=ad_h(i,j)+ad_hwater
821 ad_hwater=0.0_r8
822 END DO
823 END IF
824
826 &
domain(ng)%Southern_Edge(tile))
THEN
828 DO i=istrt,iendt
829 hwater=h(i,j)
830# ifdef ICESHELF
831 hwater=hwater-abs(zice(i,j))
832# endif
833 hinv=1.0_r8/(
hc(ng)+hwater)
837 cff2_w=(cff_w+cff1_w*hwater)*hinv
838
839
840 ad_zw(k-1)=ad_zw(k-1)-ad_hz_bry(i,k,
isouth)
841 ad_zw(k )=ad_zw(k )+ad_hz_bry(i,k,
isouth)
842 ad_hz_bry(i,k,
isouth)=0.0_r8
843
844
845
846
847
848
849 adfac=cff2_w*ad_zw(k)
850 ad_cff2_w=ad_cff2_w+ &
851 & (
boundary(ng)%zeta_south(i)+hwater)*ad_zw(k)
852 ad_hwater=ad_hwater+adfac
854 & ad_zeta_south(i)+ &
855 & ad_zw(k)+adfac
856 ad_zw(k)=0.0_r8
857
858
859
860 ad_hinv=ad_hinv+ &
861 & (cff_w+cff1_w*hwater)*ad_cff2_w
862 ad_hwater=ad_hwater+ &
863 & cff1_w*hinv*ad_cff2_w
864 ad_cff2_w=0.0_r8
865 END DO
866
867
868 ad_h(i,j)=ad_h(i,j)-ad_zw(0)
869 ad_zw(0)=0.0_r8
870
871
872 ad_hwater=ad_hwater-hinv*hinv*ad_hinv
873 ad_hinv=0.0_r8
874
875
876 ad_h(i,j)=ad_h(i,j)+ad_hwater
877 ad_hwater=0.0_r8
878 END DO
879 END IF
880
882 &
domain(ng)%Eastern_Edge(tile))
THEN
884 DO j=jstrt,jendt
885 hwater=h(i,j)
886# ifdef ICESHELF
887 hwater=hwater-abs(zice(i,j))
888# endif
889 hinv=1.0_r8/(
hc(ng)+hwater)
893 cff2_w=(cff_w+cff1_w*hwater)*hinv
894
895
896 ad_zw(k-1)=ad_zw(k-1)-ad_hz_bry(i,k,
ieast)
897 ad_zw(k )=ad_zw(k )+ad_hz_bry(i,k,
ieast)
898 ad_hz_bry(i,k,
ieast)=0.0_r8
899
900
901
902
903
904
905 adfac=cff2_w*ad_zw(k)
906 ad_cff2_w=ad_cff2_w+ &
907 & (
boundary(ng)%zeta_east(j)+hwater)*ad_zw(k)
908 ad_hwater=ad_hwater+adfac
910 & ad_zeta_east(j)+ &
911 & ad_zw(k)+adfac
912 ad_zw(k)=0.0_r8
913
914
915
916 ad_hinv=ad_hinv+ &
917 & (cff_w+cff1_w*hwater)*ad_cff2_w
918 ad_hwater=ad_hwater+ &
919 & cff1_w*hinv*ad_cff2_w
920 ad_cff2_w=0.0_r8
921 END DO
922
923
924 ad_h(i,j)=ad_h(i,j)-ad_zw(0)
925 ad_zw(0)=0.0_r8
926
927
928 ad_hwater=ad_hwater-hinv*hinv*ad_hinv
929 ad_hinv=0.0_r8
930
931
932 ad_h(i,j)=ad_h(i,j)+ad_hwater
933 ad_hwater=0.0_r8
934 END DO
935 END IF
936
938 &
domain(ng)%Western_Edge(tile))
THEN
940 DO j=jstrt,jendt
941 hwater=h(i,j)
942# ifdef ICESHELF
943 hwater=hwater-abs(zice(i,j))
944# endif
945 hinv=1.0_r8/(
hc(ng)+hwater)
949 cff2_w=(cff_w+cff1_w*hwater)*hinv
950
951
952 ad_zw(k-1)=ad_zw(k-1)-ad_hz_bry(i,k,
iwest)
953 ad_zw(k )=ad_zw(k )+ad_hz_bry(i,k,
iwest)
954 ad_hz_bry(i,k,
iwest)=0.0_r8
955
956
957
958
959
960
961 adfac=cff2_w*ad_zw(k)
962 ad_cff2_w=ad_cff2_w+ &
963 & (
boundary(ng)%zeta_west(j)+hwater)*ad_zw(k)
964 ad_hwater=ad_hwater+adfac
966 & ad_zeta_west(j)+ &
967 & ad_zw(k)+adfac
968 ad_zw(k)=0.0_r8
969
970
971
972 ad_hinv=ad_hinv+ &
973 & (cff_w+cff1_w*hwater)*ad_cff2_w
974 ad_hwater=ad_hwater+ &
975 & cff1_w*hinv*ad_cff2_w
976 ad_cff2_w=0.0_r8
977 END DO
978
979
980 ad_h(i,j)=ad_h(i,j)-ad_zw(0)
981 ad_zw(0)=0.0_r8
982
983
984 ad_hwater=ad_hwater-hinv*hinv*ad_hinv
985 ad_hinv=0.0_r8
986
987
988 ad_h(i,j)=ad_h(i,j)+ad_hwater
989 ad_hwater=0.0_r8
990 END DO
991 END IF
992 END IF
993
994 RETURN
type(t_boundary), dimension(:), allocatable boundary
type(t_lbc), dimension(:,:,:), allocatable ad_lbc
integer, dimension(:), allocatable n
type(t_bounds), dimension(:), allocatable bounds
type(t_domain), dimension(:), allocatable domain
integer, parameter r2dvar
logical, dimension(:), allocatable ewperiodic
logical, dimension(:), allocatable nsperiodic
real(dp), dimension(:), allocatable hc
integer, parameter isouth
type(t_scalars), dimension(:), allocatable scalars
integer, parameter inorth
integer, dimension(:), allocatable vtransform
subroutine ad_mp_exchange3d_bry(ng, tile, model, nvar, boundary, lbij, ubij, lbk, ubk, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c, ad_d)