New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 13027 for vendors/AGRIF/dev_r12970_AGRIF_CMEMS/AGRIF_FILES/modarrays.F90 – NEMO

Ignore:
Timestamp:
2020-06-03T16:36:09+02:00 (4 years ago)
Author:
rblod
Message:

New AGRIF library, see ticket #2129

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendors/AGRIF/dev_r12970_AGRIF_CMEMS/AGRIF_FILES/modarrays.F90

    r5656 r13027  
    5555                               proc_id,         & 
    5656                               coords,          & 
    57                                lb_tab_true, ub_tab_true, memberin ) 
     57                               lb_tab_true, ub_tab_true, memberin,  & 
     58                               indminglob3,indmaxglob3,check_perio) 
    5859!--------------------------------------------------------------------------------------------------- 
    5960    integer,                   intent(in)  :: nbdim         !< Number of dimensions 
     
    6162    integer, dimension(nbdim), intent(in)  :: ub_var        !< Local upper boundary on the current processor 
    6263    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 
    6365    integer, dimension(nbdim), intent(in)  :: ub_tab        !< Global upper boundary of the variable 
    6466    integer,                   intent(in)  :: proc_id       !< Current processor 
     
    6769    integer, dimension(nbdim), intent(out) :: ub_tab_true   !< Global value of ub_var on the current processor 
    6870    logical,                   intent(out) :: memberin 
     71    logical,optional,          intent(in)  :: check_perio   !< check for periodicity 
     72    logical :: check_perio_local 
    6973! 
    7074    integer :: i, coord_i 
    7175    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 
    7282! 
    7383    do i = 1, nbdim 
     
    7888        call Agrif_InvLoc( lb_var(i), proc_id, coord_i, lb_glob_index ) 
    7989        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 
    80105#else 
    81106        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 
    82110        ub_glob_index = ub_var(i) 
    83111#endif 
    84112        lb_tab_true(i) = max(lb_tab(i), lb_glob_index) 
    85113        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 
    86118    enddo 
    87119! 
     
    93125        endif 
    94126    enddo 
     127    if (agrif_debug_interp) then 
     128    print *,'memberin = ',memberin 
     129    endif 
    95130!--------------------------------------------------------------------------------------------------- 
    96131end subroutine Agrif_Childbounds 
     
    123158! 
    124159    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) 
    126162    lubglob(1:nbdim,2)  = - lubglob(1:nbdim,2) 
    127163#endif 
     
    659695        case('x') 
    660696! 
    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) 
    663699            nb_child(n)  = Agrif_Child_Gr % nb(1) 
    664700            s_child(n)   = Agrif_Child_Gr  % Agrif_x(1) 
     
    666702            ds_child(n)  = Agrif_Child_Gr  % Agrif_dx(1) 
    667703            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) 
    668706! 
    669707            if ( root_var % posvar(n) == 1 ) then 
     
    677715        case('y') 
    678716! 
    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) 
    681719            nb_child(n)  = Agrif_Child_Gr % nb(2) 
    682720            s_child(n)   = Agrif_Child_Gr  % Agrif_x(2) 
     
    684722            ds_child(n)  = Agrif_Child_Gr  % Agrif_dx(2) 
    685723            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) 
    686726! 
    687727            if (root_var % posvar(n)==1) then 
     
    695735        case('z') 
    696736! 
    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) 
    699739            nb_child(n)  = Agrif_Child_Gr % nb(3) 
    700740            s_child(n)   = Agrif_Child_Gr  % Agrif_x(3) 
     
    702742            ds_child(n)  = Agrif_Child_Gr  % Agrif_dx(3) 
    703743            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) 
    704746! 
    705747            if (root_var % posvar(n)==1) then 
     
    781823!--------------------------------------------------------------------------------------------------- 
    782824subroutine Agrif_GlobalToLocalBounds ( locbounds, lb_var, ub_var, lb_glob, ub_glob,    & 
    783                                        coords, nbdim, rank, member ) 
     825                                       coords, nbdim, rank, member,check_perio ) 
    784826!--------------------------------------------------------------------------------------------------- 
    785827    integer, dimension(nbdim,2,2), intent(out)   :: locbounds   !< Local values of \b lb_glob and \b ub_glob 
     
    792834    integer,                       intent(in)    :: rank        !< Rank of the processor 
    793835    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 
    796840    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 
    797849! 
    798850    locbounds(:,1,:) =  HUGE(1) 
     
    803855    do i = 1,nbdim 
    804856! 
     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 
    805864        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 
    806870! 
    807871        do k = lb_glob(i)+lb_var(i)-i1,ub_glob(i)+lb_var(i)-i1 
    808872! 
    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 
    810875                nbloc(i) = 1 
    811876                locbounds(i,1,1) = min(locbounds(i,1,1),k-lb_var(i)+i1) 
    812877                locbounds(i,2,1) = max(locbounds(i,2,1),k-lb_var(i)+i1) 
    813878 
    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 
    818884    enddo 
    819885 
Note: See TracChangeset for help on using the changeset viewer.