source: branches/GRISLIv3/SOURCES/celltest_tracer.f90 @ 455

Last change on this file since 455 was 446, checked in by aquiquet, 9 months ago

Cleaning branch: use only statement in module3D

File size: 5.0 KB
Line 
1    subroutine CellTest(time_tra, ic, jc, kc, v_x, v_y, v_E, xtracer, &
2      ytracer, E_k, im, jm, km, fx, fy, fz)
3
4
5
6      !!  Find the cell origin index for the previous time_tra step
7      use module3d_phy, only: e,uxbar,uybar,flotmx,flotmy,ux,uy,gzmx,gzmy
8      use geography, only: nx,ny,nz,dx,dy
9      use tracer_vars, only: xgrid,ygrid
10
11      implicit none
12
13      integer, intent(IN) :: time_tra
14      integer, intent(IN) :: ic, jc, kc
15      real, intent(IN) :: v_x, v_y, v_E
16      real, intent(IN) :: xtracer, ytracer
17      real, intent(INOUT) :: E_k
18      integer, intent(OUT) :: im, jm, km
19      real, intent(OUT) :: fx, fy, fz
20
21      integer :: kk   ! indice vertical pour definition de E, mais on veut conserver la valeur de k
22!      real,dimension(nz) :: E   ! vertical coordinate in ice, scaled to H zeta
23
24      E(1)=0.
25      E(NZ)=1.
26      do KK=1,NZ
27         if ((KK.ne.1).and.(KK.ne.NZ)) E(KK)=(KK-1.)/(NZ-1.)
28      end do
29
30
31      if(v_x>0.0) then
32        im = ic-1
33        do
34          if(xtracer>=xgrid(im) .and. xtracer<=xgrid(im+1)) exit
35          !! PRINT *,"CellTest(x-): Multiple decrement required (",ic,",",jc,",",kc,")"
36          im = im-1
37          if(im<1) then
38            print *,"CellTest(x-;",time_tra,"): Out-of_range decrement (",ic,",",jc,",",kc,")", v_x
39!           STOP
40           im =ic
41           exit
42         end if
43        end do
44      else
45        im = ic
46        do
47          if(xtracer>=xgrid(im) .and. xtracer<=xgrid(im+1)) exit
48          !! PRINT *,"CellTest(x+): Multiple increment required (",ic,",",jc,",",kc,")"
49          im = im+1
50          if(im==nx-1) then
51            print *,"CellTest(x+;",time_tra,"): Out-of_range increment (",ic,",",jc,",",kc,")", v_x
52!           STOP
53             im = ic -1
54             exit
55          end if
56        end do
57      end if
58
59      fx = abs(xtracer-xgrid(im))/dx
60  if (fx>1.00)    fx = fx - aint(fx)
61
62!     if((fx>1.0).or.(fx<0.0)) THEN
63!       PRINT *,"Cell test(!!!)", ic,jc, kc,im, fx
64!     END IF
65!----------------------------------------------------------------------------------
66
67      if(v_y>0.0) then
68        jm = jc -1
69        do
70          if(ytracer>=ygrid(jm) .and. ytracer<=ygrid(jm+1)) exit
71          !! PRINT *,"CellTest(y-): Multiple decrement required (",ic,",",jc,",",kc,")"
72          jm = jm-1
73          if(jm<1) then
74            print *,"CellTest(y-;",time_tra,"): Out-of_range decrement (",ic,",",jc,",",kc,")", v_y
75!           STOP
76              jm =jc
77              exit
78          end if
79        end do
80      else
81        jm = jc
82        do
83          if(ytracer>=ygrid(jm) .and. ytracer<=ygrid(jm+1)) exit
84          !! PRINT *,"CellTest(y+): Multiple increment required (",ic,",",jc,",",kc,")"
85          jm = jm+1
86          if(jm==ny-1) then
87            print *,"CellTest(y+;",time_tra,"): Out-of-range increment (",ic,",",jc,",",kc,")", v_y
88!           print*, ytracer, ygrid(jm)
89            print*, uybar(ic,jc), uybar(ic,jc+1), flotmy(ic,jc), flotmy(ic, jc+1)
90            print *, uy(ic,jc,:)
91            print *, uy(ic,jc+1,:)
92            print*, gzmy(ic, jc), gzmy(ic,jc+1)
93!           STOP
94             jm = jc-1
95             exit
96          end if
97        end do
98      end if
99
100      fy = abs(ytracer-ygrid(jm))/dy
101  if (fy>1.00)    fy = fy - aint(fy)
102
103!     if((fy>1.0).or.(fy<0.0)) THEN
104!       PRINT *,"Cell test(!!!)", ic,jc,kc,im,jm, fy
105!     END IF
106 
107!-------------------------------------------------------------------------------
108
109      !! Note that v_E is "velocity" in E coordinate system which is
110      !! positive DOWN
111      ! also note that in Catritz code k=1 for surface
112
113   
114  if(E_k < E(1)) then
115        E_k = E(1)
116        km=1     
117   
118  else if(E_k > E(nz)) then
119        E_k = E(nz)
120        km=nz-1
121
122  else   ! this used to be a loop on its own, now shortcuts if E_k is special
123
124      if(v_E>=0.0) then   !! Downward flow of ice in E system
125        if (kc==1) then
126          !! No action, pending tactical discussion with GKCC
127          km = 1
128        else
129          km=kc - 1
130          do
131            if( (E_k >= E(km)) .and. (E_k <= E(km+1)) ) exit
132            km = km - 1
133            if(km==0) then
134              print *,"CellTest(z+;",time_tra,"): Out-of-range increment (",ic,",",jc,",",kc,")", v_E
135!             STOP
136              km = kc
137              exit
138            end if
139          end do
140        end if
141      else                             !! Upward flow of ice in E system
142        if(kc==nz) then   
143        ! this is incomplete: ice comes from below, cannot use above layer, fix in interpolate
144          km = kc-1
145        else
146          km = kc
147         do
148          if( (E_k >= E(km)) .and. (E_k <= E(km+1)) ) exit
149          !! PRINT *,"CellTest(z,",time_tra,"): Decrementing km=",km
150          km = km + 1
151          if(km==nz) then
152            print *,"CellTest(z-;",time_tra,"): Out-of-range decrement (",ic,",",jc,",",kc,")", v_E
153!           STOP
154             km = kc-1
155             exit
156          end if
157         end do
158       end if
159
160     end if  ! velocity direction
161
162      fz = abs((E_k-E(km))/(E(km+1)-E(km)))
163  if (fz>1.00)    fz = fz - aint(fz)
164
165  end if
166
167    end subroutine CellTest
168!===========================================================================
Note: See TracBrowser for help on using the repository browser.