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.
agrif_top_interp.F90 in trunk/NEMOGCM/NEMO/NST_SRC – NEMO

source: trunk/NEMOGCM/NEMO/NST_SRC/agrif_top_interp.F90 @ 2715

Last change on this file since 2715 was 2715, checked in by rblod, 13 years ago

First attempt to put dynamic allocation on the trunk

  • Property svn:keywords set to Id
File size: 5.4 KB
Line 
1MODULE agrif_top_interp
2#if defined key_agrif && defined key_top
3   USE par_oce
4   USE oce
5   USE dom_oce     
6   USE sol_oce
7   USE agrif_oce
8   USE agrif_top_sponge
9   USE trc
10   USE lib_mpp
11
12   IMPLICIT NONE
13   PRIVATE
14
15   PUBLIC Agrif_trc
16
17#  include "domzgr_substitute.h90" 
18#  include "vectopt_loop_substitute.h90"
19  !!----------------------------------------------------------------------
20   !! NEMO/NST 3.3 , NEMO Consortium (2010)
21   !! $Id$
22   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
23   !!----------------------------------------------------------------------
24
25   CONTAINS
26
27   SUBROUTINE Agrif_trc
28      !!---------------------------------------------
29      !!   *** ROUTINE Agrif_trc ***
30      !!---------------------------------------------
31      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
32      USE wrk_nemo, ONLY: wrk_4d_1
33     
34      INTEGER :: ji,jj,jk,jn
35      REAL(wp) :: zrhox
36      REAL(wp) :: alpha1, alpha2, alpha3, alpha4
37      REAL(wp) :: alpha5, alpha6, alpha7
38      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztra
39           
40      IF (Agrif_Root()) RETURN
41
42      IF( wrk_in_use(4, 1) ) THEN
43         CALL ctl_stop('Agrif_trc : requested workspace arrays unavailable')
44         RETURN
45      ENDIF
46      ztra =>  wrk_4d_1(:,:,:,jptra)
47
48      Agrif_SpecialValue=0.
49      Agrif_UseSpecialValue = .TRUE.
50      ztra = 0.e0
51
52      CALL Agrif_Bc_variable(ztra,trn_id, procname = interptrn )
53      Agrif_UseSpecialValue = .FALSE.
54
55      zrhox = Agrif_Rhox()
56
57      alpha1 = (zrhox-1.)/2.
58      alpha2 = 1.-alpha1
59
60      alpha3 = (zrhox-1)/(zrhox+1)
61      alpha4 = 1.-alpha3
62
63      alpha6 = 2.*(zrhox-1.)/(zrhox+1.)
64      alpha7 = -(zrhox-1)/(zrhox+3)
65      alpha5 = 1. - alpha6 - alpha7
66
67      IF ((nbondi == 1).OR.(nbondi == 2)) THEN
68         tra(nlci,:,:,:) = alpha1 * ztra(nlci,:,:,:) + alpha2 * ztra(nlci-1,:,:,:)
69         DO jn=1,jptra 
70            DO jk=1,jpk     
71               DO jj=1,jpj
72                  IF (umask(nlci-2,jj,jk).EQ.0.) THEN
73                     tra(nlci-1,jj,jk,jn) = tra(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk)
74                  ELSE
75                     tra(nlci-1,jj,jk,jn)=(alpha4*tra(nlci,jj,jk,jn)+alpha3*tra(nlci-2,jj,jk,jn))*tmask(nlci-1,jj,jk)
76                     IF (un(nlci-2,jj,jk).GT.0.) THEN
77                        tra(nlci-1,jj,jk,jn)=(alpha6*tra(nlci-2,jj,jk,jn)+alpha5*tra(nlci,jj,jk,jn) &
78                           +alpha7*tra(nlci-3,jj,jk,jn))*tmask(nlci-1,jj,jk)
79                     ENDIF
80                  ENDIF
81               END DO
82            END DO
83         END DO
84      ENDIF
85
86      IF ((nbondj == 1).OR.(nbondj == 2)) THEN
87         tra(:,nlcj,:,:) = alpha1 * ztra(:,nlcj,:,:) + alpha2 * ztra(:,nlcj-1,:,:)
88         DO jn=1, jptra           
89            DO jk=1,jpk     
90               DO ji=1,jpi
91                  IF (vmask(ji,nlcj-2,jk).EQ.0.) THEN
92                     tra(ji,nlcj-1,jk,jn) = tra(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk)
93                  ELSE
94                     tra(ji,nlcj-1,jk,jn)=(alpha4*tra(ji,nlcj,jk,jn)+alpha3*tra(ji,nlcj-2,jk,jn))*tmask(ji,nlcj-1,jk)       
95                     IF (vn(ji,nlcj-2,jk) .GT. 0.) THEN
96                        tra(ji,nlcj-1,jk,jn)=(alpha6*tra(ji,nlcj-2,jk,jn)+alpha5*tra(ji,nlcj,jk,jn) &
97                           +alpha7*tra(ji,nlcj-3,jk,jn))*tmask(ji,nlcj-1,jk)
98                     ENDIF
99                  ENDIF
100               END DO
101            END DO
102         END DO
103      ENDIF
104
105      IF ((nbondi == -1).OR.(nbondi == 2)) THEN
106         tra(1,:,:,:) = alpha1 * ztra(1,:,:,:) + alpha2 * ztra(2,:,:,:)
107         DO jn=1, jptra
108            DO jk=1,jpk     
109               DO jj=1,jpj
110                  IF (umask(2,jj,jk).EQ.0.) THEN
111                     tra(2,jj,jk,jn) = tra(1,jj,jk,jn) * tmask(2,jj,jk)
112                  ELSE
113                     tra(2,jj,jk,jn)=(alpha4*tra(1,jj,jk,jn)+alpha3*tra(3,jj,jk,jn))*tmask(2,jj,jk)       
114                     IF (un(2,jj,jk).LT.0.) THEN
115                        tra(2,jj,jk,jn)=(alpha6*tra(3,jj,jk,jn)+alpha5*tra(1,jj,jk,jn) &
116                           +alpha7*tra(4,jj,jk,jn))*tmask(2,jj,jk)
117                     ENDIF
118                  ENDIF
119               END DO
120            END DO
121         END DO
122      ENDIF
123
124      IF ((nbondj == -1).OR.(nbondj == 2)) THEN
125         tra(:,1,:,:) = alpha1 * ztra(:,1,:,:) + alpha2 * ztra(:,2,:,:)
126         DO jn=1, jptra 
127            DO jk=1,jpk     
128               DO ji=1,jpi
129                  IF (vmask(ji,2,jk).EQ.0.) THEN
130                     tra(ji,2,jk,jn)=tra(ji,1,jk,jn) * tmask(ji,2,jk)
131                  ELSE
132                     tra(ji,2,jk,jn)=(alpha4*tra(ji,1,jk,jn)+alpha3*tra(ji,3,jk,jn))*tmask(ji,2,jk)
133                     IF (vn(ji,2,jk) .LT. 0.) THEN
134                        tra(ji,2,jk,jn)=(alpha6*tra(ji,3,jk,jn)+alpha5*tra(ji,1,jk,jn)&
135                           +alpha7*tra(ji,4,jk,jn))*tmask(ji,2,jk)
136                     ENDIF
137                  ENDIF
138               END DO
139            END DO
140         END DO
141      ENDIF
142
143      IF( wrk_not_released(4, 1) ) THEN
144         CALL ctl_stop('Agrif_trc : failed to release workspace arrays.')
145         RETURN
146      ENDIF
147
148   END SUBROUTINE Agrif_trc
149
150#else
151CONTAINS
152   SUBROUTINE Agrif_TOP_Interp_empty
153      !!---------------------------------------------
154      !!   *** ROUTINE agrif_Top_Interp_empty ***
155      !!---------------------------------------------
156      WRITE(*,*)  'agrif_top_interp : You should not have seen this print! error?'
157   END SUBROUTINE Agrif_TOP_Interp_empty
158#endif
159END MODULE agrif_top_interp
Note: See TracBrowser for help on using the repository browser.