- Timestamp:
- 2020-06-03T16:36:09+02:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendors/AGRIF/dev_r12970_AGRIF_CMEMS/AGRIF_FILES/modarrays.F90
r5656 r13027 55 55 proc_id, & 56 56 coords, & 57 lb_tab_true, ub_tab_true, memberin ) 57 lb_tab_true, ub_tab_true, memberin, & 58 indminglob3,indmaxglob3,check_perio) 58 59 !--------------------------------------------------------------------------------------------------- 59 60 integer, intent(in) :: nbdim !< Number of dimensions … … 61 62 integer, dimension(nbdim), intent(in) :: ub_var !< Local upper boundary on the current processor 62 63 integer, dimension(nbdim), intent(in) :: lb_tab !< Global lower boundary of the variable 64 integer, dimension(nbdim),OPTIONAL :: indminglob3,indmaxglob3 !< True bounds for MPI USE 63 65 integer, dimension(nbdim), intent(in) :: ub_tab !< Global upper boundary of the variable 64 66 integer, intent(in) :: proc_id !< Current processor … … 67 69 integer, dimension(nbdim), intent(out) :: ub_tab_true !< Global value of ub_var on the current processor 68 70 logical, intent(out) :: memberin 71 logical,optional, intent(in) :: check_perio !< check for periodicity 72 logical :: check_perio_local 69 73 ! 70 74 integer :: i, coord_i 71 75 integer :: lb_glob_index, ub_glob_index ! Lower and upper global indices 76 77 if (present(check_perio)) then 78 check_perio_local=check_perio 79 else 80 check_perio_local = .FALSE. 81 endif 72 82 ! 73 83 do i = 1, nbdim … … 78 88 call Agrif_InvLoc( lb_var(i), proc_id, coord_i, lb_glob_index ) 79 89 call Agrif_InvLoc( ub_var(i), proc_id, coord_i, ub_glob_index ) 90 if (agrif_debug_interp .or. agrif_debug_update) then 91 print *,'direction ',i,' lblogb ubglob = ',lb_glob_index,ub_glob_index 92 endif 93 if (check_perio_local .AND. agrif_curgrid%periodicity(i)) then 94 if (lb_tab(i)>=lb_glob_index) then 95 else if (lb_tab(i)<ub_glob_index-agrif_curgrid%periodicity_decal(i)) then 96 lb_glob_index = lb_glob_index - agrif_curgrid%periodicity_decal(i) 97 ub_glob_index = ub_glob_index - agrif_curgrid%periodicity_decal(i) 98 endif 99 endif 100 101 if (present(indminglob3)) then 102 indminglob3(i)=lb_glob_index 103 indmaxglob3(i)=ub_glob_index 104 endif 80 105 #else 81 106 lb_glob_index = lb_var(i) 107 if (check_perio_local .AND. agrif_curgrid%periodicity(i)) then 108 lb_glob_index = lb_tab(i) 109 endif 82 110 ub_glob_index = ub_var(i) 83 111 #endif 84 112 lb_tab_true(i) = max(lb_tab(i), lb_glob_index) 85 113 ub_tab_true(i) = min(ub_tab(i), ub_glob_index) 114 if (agrif_debug_interp .or. agrif_debug_update) then 115 print *,'childbounds = ',i,lb_tab(i),lb_glob_index,lb_tab_true(i), & 116 ub_tab(i),ub_glob_index,ub_tab_true(i) 117 endif 86 118 enddo 87 119 ! … … 93 125 endif 94 126 enddo 127 if (agrif_debug_interp) then 128 print *,'memberin = ',memberin 129 endif 95 130 !--------------------------------------------------------------------------------------------------- 96 131 end subroutine Agrif_Childbounds … … 123 158 ! 124 159 iminmaxg(1:nbdim,2) = - iminmaxg(1:nbdim,2) 125 call MPI_ALLREDUCE(iminmaxg, lubglob, 2*nbdim, MPI_INTEGER, MPI_MIN, Agrif_mpi_comm, code) 160 call MPI_ALLREDUCE(iminmaxg, lubglob, 2*nbdim, MPI_INTEGER, MPI_MIN, & 161 Agrif_mpi_comm, code) 126 162 lubglob(1:nbdim,2) = - lubglob(1:nbdim,2) 127 163 #endif … … 659 695 case('x') 660 696 ! 661 lb_child(n) = root_var %point(n)662 lb_parent(n) = root_var %point(n)697 lb_child(n) = child%point(n) 698 lb_parent(n) = child%parent_var%point(n) 663 699 nb_child(n) = Agrif_Child_Gr % nb(1) 664 700 s_child(n) = Agrif_Child_Gr % Agrif_x(1) … … 666 702 ds_child(n) = Agrif_Child_Gr % Agrif_dx(1) 667 703 ds_parent(n) = Agrif_Parent_Gr % Agrif_dx(1) 704 ! Take into account potential difference of first points 705 s_parent(n) = s_parent(n) + (lb_parent(n)-lb_child(n))*ds_parent(n) 668 706 ! 669 707 if ( root_var % posvar(n) == 1 ) then … … 677 715 case('y') 678 716 ! 679 lb_child(n) = root_var %point(n)680 lb_parent(n) = root_var %point(n)717 lb_child(n) = child%point(n) 718 lb_parent(n) = child%parent_var%point(n) 681 719 nb_child(n) = Agrif_Child_Gr % nb(2) 682 720 s_child(n) = Agrif_Child_Gr % Agrif_x(2) … … 684 722 ds_child(n) = Agrif_Child_Gr % Agrif_dx(2) 685 723 ds_parent(n) = Agrif_Parent_Gr % Agrif_dx(2) 724 ! Take into account potential difference of first points 725 s_parent(n) = s_parent(n) + (lb_parent(n)-lb_child(n))*ds_parent(n) 686 726 ! 687 727 if (root_var % posvar(n)==1) then … … 695 735 case('z') 696 736 ! 697 lb_child(n) = root_var %point(n)698 lb_parent(n) = root_var %point(n)737 lb_child(n) = child%point(n) 738 lb_parent(n) = child%parent_var%point(n) 699 739 nb_child(n) = Agrif_Child_Gr % nb(3) 700 740 s_child(n) = Agrif_Child_Gr % Agrif_x(3) … … 702 742 ds_child(n) = Agrif_Child_Gr % Agrif_dx(3) 703 743 ds_parent(n) = Agrif_Parent_Gr % Agrif_dx(3) 744 ! Take into account potential difference of first points 745 s_parent(n) = s_parent(n) + (lb_parent(n)-lb_child(n))*ds_parent(n) 704 746 ! 705 747 if (root_var % posvar(n)==1) then … … 781 823 !--------------------------------------------------------------------------------------------------- 782 824 subroutine Agrif_GlobalToLocalBounds ( locbounds, lb_var, ub_var, lb_glob, ub_glob, & 783 coords, nbdim, rank, member )825 coords, nbdim, rank, member,check_perio ) 784 826 !--------------------------------------------------------------------------------------------------- 785 827 integer, dimension(nbdim,2,2), intent(out) :: locbounds !< Local values of \b lb_glob and \b ub_glob … … 792 834 integer, intent(in) :: rank !< Rank of the processor 793 835 logical, intent(out) :: member 794 ! 795 integer :: i, i1, k 836 logical,optional, intent(in) :: check_perio !< check for periodicity 837 logical :: check_perio_local 838 ! 839 integer :: i, i1, k, idecal 796 840 integer :: nbloc(nbdim) 841 842 if (present(check_perio)) then 843 check_perio_local=check_perio 844 else 845 check_perio_local = .FALSE. 846 endif 847 ! 848 797 849 ! 798 850 locbounds(:,1,:) = HUGE(1) … … 803 855 do i = 1,nbdim 804 856 ! 857 if (coords(i) == 0) then 858 nbloc(i) = 1 859 locbounds(i,1,1) = lb_glob(i) 860 locbounds(i,2,1) = ub_glob(i) 861 locbounds(i,1,2) = lb_glob(i) 862 locbounds(i,2,2) = ub_glob(i) 863 else 805 864 call Agrif_InvLoc(lb_var(i), rank, coords(i), i1) 865 if ((i1>ub_glob(i)).AND.check_perio_local) then 866 idecal = agrif_curgrid%periodicity_decal(i) 867 else 868 idecal = 0 869 endif 806 870 ! 807 871 do k = lb_glob(i)+lb_var(i)-i1,ub_glob(i)+lb_var(i)-i1 808 872 ! 809 if ( (k >= lb_var(i)) .AND. (k <= ub_var(i)) ) then 873 if ( (k + idecal >= lb_var(i)) .AND. (k + idecal <= ub_var(i)) ) then 874 ! if ((k<=ub_var(i)).AND.((k>=lb_var(i).OR.check_perio_local))) then 810 875 nbloc(i) = 1 811 876 locbounds(i,1,1) = min(locbounds(i,1,1),k-lb_var(i)+i1) 812 877 locbounds(i,2,1) = max(locbounds(i,2,1),k-lb_var(i)+i1) 813 878 814 locbounds(i,1,2) = min(locbounds(i,1,2),k) 815 locbounds(i,2,2) = max(locbounds(i,2,2),k) 816 endif 817 enddo 879 locbounds(i,1,2) = min(locbounds(i,1,2),k + idecal) 880 locbounds(i,2,2) = max(locbounds(i,2,2),k + idecal) 881 endif 882 enddo 883 endif 818 884 enddo 819 885
Note: See TracChangeset
for help on using the changeset viewer.