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 13924 for vendors/AGRIF – NEMO

Changeset 13924 for vendors/AGRIF


Ignore:
Timestamp:
2020-11-30T16:04:35+01:00 (3 years ago)
Author:
jchanut
Message:

#2222, fixes linear conservative interpolation - version with limiter currently disabled

File:
1 edited

Legend:

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

    r13027 r13924  
    3737    real, dimension(:),   allocatable       :: tabtest4 
    3838    real, dimension(:,:), allocatable       :: coeffparent 
    39     integer, dimension(:,:), allocatable    :: indparent 
     39    integer, private, dimension(:,:), allocatable    :: indparent 
    4040    integer, dimension(:,:), allocatable    :: indparentppm, indchildppm 
    4141    integer, dimension(:), allocatable      :: indparentppm_1d, indchildppm_1d 
     
    5656    integer,             intent(in)     :: np           !< Length of input array 
    5757    integer,             intent(in)     :: nc           !< Length of output array 
    58     real,                intent(in)     :: s_parent     !< Parent grid position (s_root = 0) 
    59     real,                intent(in)     :: s_child      !< Child  grid position (s_root = 0) 
    60     real,                intent(in)     :: ds_parent    !< Parent grid dx (ds_root = 1) 
    61     real,                intent(in)     :: ds_child     !< Child  grid dx (ds_root = 1) 
     58    real(kind=8),                intent(in)     :: s_parent     !< Parent grid position (s_root = 0) 
     59    real(kind=8),                intent(in)     :: s_child      !< Child  grid position (s_root = 0) 
     60    real(kind=8),                intent(in)     :: ds_parent    !< Parent grid dx (ds_root = 1) 
     61    real(kind=8),                intent(in)     :: ds_child     !< Child  grid dx (ds_root = 1) 
    6262! 
    6363    integer :: i, coeffraf, locind_parent_left 
    64     real    :: globind_parent_left, globind_parent_right 
    65     real    :: invds, invds2, ypos, ypos2, diff 
     64    real(kind=8)    :: globind_parent_left, globind_parent_right 
     65    real(kind=8)    :: invds, invds2, ypos, ypos2, diff 
    6666! 
    6767    coeffraf = nint(ds_parent/ds_child) 
     
    9292! 
    9393        diff = globind_parent_right - ypos2 
     94! quick fix for roundoff error 
     95        diff=nint(diff*coeffraf)/real(coeffraf) 
     96 
    9497        y(i) = (diff*x(locind_parent_left) + (1.-diff)*x(locind_parent_left+1)) 
    9598        ypos2 = ypos2 + invds2 
     
    104107    else 
    105108        globind_parent_left = s_parent + (locind_parent_left - 1)*ds_parent 
    106         y(nc) = ((globind_parent_left + ds_parent - ypos)*x(locind_parent_left)  & 
    107                            + (ypos - globind_parent_left)*x(locind_parent_left+1))*invds 
     109        diff=(globind_parent_left + ds_parent - ypos)*invds 
     110 
     111! quick fix for roundoff error 
     112        diff=nint(diff*coeffraf)/real(coeffraf) 
     113!        y(nc) = ((globind_parent_left + ds_parent - ypos)*x(locind_parent_left)  & 
     114!                           + (ypos - globind_parent_left)*x(locind_parent_left+1))*invds 
     115        y(nc) = (diff*x(locind_parent_left) + (1.-diff)*x(locind_parent_left+1)) 
    108116    endif 
    109117!--------------------------------------------------------------------------------------------------- 
     
    120128!--------------------------------------------------------------------------------------------------- 
    121129    integer, intent(in) :: np,nc,np2 
    122     real,    intent(in) :: s_parent, s_child 
    123     real,    intent(in) :: ds_parent, ds_child 
     130    real(kind=8),    intent(in) :: s_parent, s_child 
     131    real(kind=8),    intent(in) :: ds_parent, ds_child 
    124132    integer, intent(in) :: dir 
    125133! 
     
    127135    integer, dimension(:,:), allocatable :: indparent_tmp 
    128136    real, dimension(:,:), allocatable :: coeffparent_tmp 
    129     real    :: ypos,globind_parent_left,globind_parent_right 
    130     real    :: invds, invds2, invds3 
    131     real :: ypos2,diff 
     137    real(kind=8)    :: ypos,globind_parent_left,globind_parent_right 
     138    real(kind=8)    :: invds, invds2, invds3 
     139    real(kind=8) :: ypos2,diff 
    132140! 
    133141    coeffraf = nint(ds_parent/ds_child) 
     
    164172        if (ypos2 > globind_parent_right) then 
    165173            locind_parent_left = locind_parent_left + 1 
    166             globind_parent_right = globind_parent_right + 1. 
     174            globind_parent_right = globind_parent_right + 1.d0 
    167175            ypos2 = ypos*invds+(i-1)*invds2 
    168176        endif 
     
    246254    real, dimension(np), intent(in)     :: x 
    247255    real, dimension(nc), intent(out)    :: y 
    248     real,                intent(in)     :: s_parent, s_child 
    249     real,                intent(in)     :: ds_parent, ds_child 
     256    real(kind=8),                intent(in)     :: s_parent, s_child 
     257    real(kind=8),                intent(in)     :: ds_parent, ds_child 
    250258! 
    251259    integer :: i, coeffraf, locind_parent_left 
    252     real    :: ypos,globind_parent_left 
    253     real    :: deltax, invdsparent 
     260    real(kind=8)    :: ypos,globind_parent_left 
     261    real(kind=8)    :: deltax, invdsparent 
    254262    real    :: t2,t3,t4,t5,t6,t7,t8 
    255263! 
     
    311319    real, dimension(np), intent(in)     :: x 
    312320    real, dimension(nc), intent(out)    :: y 
    313     real,                intent(in)     :: s_parent, s_child 
    314     real,                intent(in)     :: ds_parent, ds_child 
     321    real(kind=8),                intent(in)     :: s_parent, s_child 
     322    real(kind=8),                intent(in)     :: ds_parent, ds_child 
    315323! 
    316324    integer :: i, coeffraf, locind_parent 
    317     real    :: ypos 
     325    real(kind=8)    :: ypos 
    318326! 
    319327    coeffraf = nint(ds_parent/ds_child) 
     
    349357    real, dimension(np), intent(in)     :: x 
    350358    real, dimension(nc), intent(out)    :: y 
    351     real,                intent(in)     :: s_parent, s_child 
    352     real,                intent(in)     :: ds_parent, ds_child 
     359    real(kind=8),                intent(in)     :: s_parent, s_child 
     360    real(kind=8),                intent(in)     :: ds_parent, ds_child 
    353361! 
    354362    real, dimension(:), allocatable :: ytemp 
    355363    integer :: i,coeffraf,locind_parent_left,locind_parent_last 
    356     real    :: ypos,xdiffmod,xpmin,xpmax,slope 
     364    real(kind=8)    :: ypos,xdiffmod,xpmin,xpmax,slope 
    357365    integer :: i1,i2,ii 
    358366    integer :: diffmod 
     
    393401 
    394402    do ii = i-coeffraf/2+diffmod,i+coeffraf/2 
    395         ytemp(ii) = x(locind_parent_left)+(ii-i-xdiffmod/2.)*slope 
     403        ytemp(ii) = x(locind_parent_left)+(ii-i-xdiffmod)*slope 
    396404    enddo 
    397405 
     
    401409        slope = (x(locind_parent_left+1)-x(locind_parent_left-1))/(2.*coeffraf) 
    402410        do ii = i-coeffraf/2+diffmod,i+coeffraf/2 
    403             ytemp(ii) = x(locind_parent_left)+(ii-i-xdiffmod/2.)*slope 
     411            ytemp(ii) = x(locind_parent_left)+(ii-i-xdiffmod)*slope 
    404412        enddo 
    405413        locind_parent_left = locind_parent_left + 1 
     
    415423 
    416424    do ii = i-coeffraf/2+diffmod,nc 
    417         ytemp(ii) = x(locind_parent_left)+(ii-i-xdiffmod/2.)*slope 
     425        ytemp(ii) = x(locind_parent_left)+(ii-i-xdiffmod)*slope 
    418426    enddo 
    419427! 
     
    436444    real, dimension(np), intent(in)     :: x 
    437445    real, dimension(nc), intent(out)    :: y 
    438     real,                intent(in)     :: s_parent, s_child 
    439     real,                intent(in)     :: ds_parent, ds_child 
     446    real(kind=8),                intent(in)     :: s_parent, s_child 
     447    real(kind=8),                intent(in)     :: ds_parent, ds_child 
    440448! 
    441449    real, dimension(:), allocatable :: ytemp 
    442450    integer :: i,coeffraf,locind_parent_left,locind_parent_last 
    443     real    :: ypos,xdiffmod,xpmin,xpmax,slope 
     451    real(kind=8)    :: ypos,xdiffmod,xpmin,xpmax,slope 
    444452    integer :: i1,i2,ii 
    445453    integer :: diffmod 
     
    486494 
    487495    do ii = i-coeffraf/2+diffmod,i+coeffraf/2 
    488         ytemp(ii) = x(locind_parent_left)+(ii-i-xdiffmod/2.)*slope 
     496        ytemp(ii) = x(locind_parent_left)+(ii-i-xdiffmod)*slope 
    489497    enddo 
    490498 
     
    495503        slope = slope / coeffraf 
    496504        do ii=i-coeffraf/2+diffmod,i+coeffraf/2 
    497             ytemp(ii) = x(locind_parent_left)+(ii-i-xdiffmod/2.)*slope 
     505            ytemp(ii) = x(locind_parent_left)+(ii-i-xdiffmod)*slope 
    498506        enddo 
    499507        locind_parent_left = locind_parent_left + 1 
     
    510518 
    511519    do ii=i-coeffraf/2+diffmod,nc 
    512         ytemp(ii) = x(locind_parent_left)+(ii-i-xdiffmod/2.)*slope 
     520        ytemp(ii) = x(locind_parent_left)+(ii-i-xdiffmod)*slope 
    513521    enddo 
    514522! 
     
    531539    real, dimension(np), intent(in)     :: x 
    532540    real, dimension(nc), intent(out)    :: y 
    533     real,                intent(in)     :: s_parent, s_child 
    534     real,                intent(in)     :: ds_parent, ds_child 
     541    real(kind=8),                intent(in)     :: s_parent, s_child 
     542    real(kind=8),                intent(in)     :: ds_parent, ds_child 
    535543! 
    536544    integer :: i,coeffraf,locind_parent_left,locind_parent_last 
    537545    integer :: iparent,ipos,pos,nmin,nmax 
    538     real    :: ypos 
     546    real(kind=8)    :: ypos 
    539547    integer :: i1,jj 
    540     real :: xpmin,a 
     548    real(kind=8) :: xpmin 
     549    real :: a 
    541550! 
    542551    real, dimension(np) :: xl,delta,a6,slope 
     
    653662!--------------------------------------------------------------------------------------------------- 
    654663    integer,             intent(in)     :: np2, np, nc 
    655     real,                intent(in)     :: s_parent, s_child 
    656     real,                intent(in)     :: ds_parent, ds_child 
     664    real(kind=8),                intent(in)     :: s_parent, s_child 
     665    real(kind=8),                intent(in)     :: ds_parent, ds_child 
    657666    integer,             intent(in)     :: dir 
    658667! 
     
    663672    real    :: ypos 
    664673    integer :: i1,jj 
    665     real :: xpmin,a 
     674    real(kind=8) :: xpmin 
     675    real :: a 
    666676! 
    667677    integer :: diffmod 
     
    10761086    real, dimension(np), intent(in)     :: x 
    10771087    real, dimension(nc), intent(out)    :: y 
    1078     real,                intent(in)     :: s_parent, s_child 
    1079     real,                intent(in)     :: ds_parent, ds_child 
     1088    real(kind=8),                intent(in)     :: s_parent, s_child 
     1089    real(kind=8),                intent(in)     :: ds_parent, ds_child 
    10801090! 
    10811091    real, dimension(:), allocatable :: ytemp 
    10821092    integer :: i,coeffraf,locind_parent_left,locind_parent_last 
    10831093    integer :: iparent,ipos,pos,nmin,nmax 
    1084     real    :: ypos 
     1094    real(kind=8)    :: ypos 
    10851095    integer :: i1,jj 
    1086     real :: xpmin 
     1096    real(kind=8) :: xpmin 
    10871097! 
    10881098    real, dimension(np) :: slope 
     
    11731183    real, dimension(np), intent(in)     :: x 
    11741184    real, dimension(nc), intent(out)    :: y 
    1175     real,                intent(in)     :: s_parent, s_child 
    1176     real,                intent(in)     :: ds_parent, ds_child 
     1185    real(kind=8),                intent(in)     :: s_parent, s_child 
     1186    real(kind=8),                intent(in)     :: ds_parent, ds_child 
    11771187! 
    11781188    integer :: i,coeffraf,locind_parent_left,locind_parent_last 
    11791189    integer :: ipos, pos 
    1180     real    :: ypos,xi 
     1190    real(kind=8)    :: ypos,xi 
    11811191    integer :: i1,jj 
    1182     real :: xpmin 
     1192    real(kind=8) :: xpmin 
    11831193! 
    11841194    real, dimension(:),   allocatable  :: ytemp 
     
    12831293      Real, Dimension(nc) :: y 
    12841294      Real, Dimension(:),Allocatable :: ytemp 
    1285       Real                :: s_parent,s_child,ds_parent,ds_child 
     1295      Real(kind=8)        :: s_parent,s_child,ds_parent,ds_child 
    12861296! 
    12871297!     Local scalars 
    12881298      Integer :: i,coeffraf,locind_parent_left,locind_parent_last 
    12891299      Integer :: iparent,ipos,pos,nmin,nmax 
    1290       Real    :: ypos 
     1300      Real(kind=8)    :: ypos 
    12911301      integer :: i1,jj 
    1292       Real :: xpmin,cavg,a,b 
     1302      Real(kind=8) :: xpmin 
     1303      real :: cavg,a,b 
    12931304!       
    12941305      Real :: xrmin,xrmax,am3,s2,s1   
Note: See TracChangeset for help on using the changeset viewer.