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/NEMO/NST_SRC – NEMO

source: trunk/NEMO/NST_SRC/agrif_top_interp.F90 @ 635

Last change on this file since 635 was 628, checked in by opalod, 17 years ago

nemo_v2_update_006:RB: first integration of AGRIF for passive tracers

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.0 KB
Line 
1!
2      Module agrif_top_interp
3#if defined key_agrif && defined key_passivetrc
4      USE par_oce
5      USE oce
6      USE dom_oce     
7      USE sol_oce
8      USE trc
9      USE sms
10
11      CONTAINS
12      SUBROUTINE Agrif_trc( kt )
13
14      Implicit none
15     
16   !! * Substitutions
17#  include "domzgr_substitute.h90" 
18#  include "vectopt_loop_substitute.h90"
19!
20      INTEGER :: kt
21      REAL(wp) tratemp(jpi,jpj,jpk,jptra)
22      INTEGER :: ji,jj,jk,jn
23      REAL(wp) :: rhox
24      REAL(wp) :: alpha1, alpha2, alpha3, alpha4
25      REAL(wp) :: alpha5, alpha6, alpha7
26!
27        IF (Agrif_Root()) RETURN
28
29           Agrif_SpecialValue=0.
30           Agrif_UseSpecialValue = .TRUE.
31           tratemp = 0.
32
33           Call Agrif_Bc_variable(tratemp,trn)
34           Agrif_UseSpecialValue = .FALSE.
35       
36           rhox = Agrif_Rhox()
37   
38           alpha1 = (rhox-1.)/2.
39           alpha2 = 1.-alpha1
40   
41           alpha3 = (rhox-1)/(rhox+1)
42           alpha4 = 1.-alpha3
43   
44           alpha6 = 2.*(rhox-1.)/(rhox+1.)
45           alpha7 = -(rhox-1)/(rhox+3)
46           alpha5 = 1. - alpha6 - alpha7
47   
48!
49      If ((nbondi == 1).OR.(nbondi == 2)) THEN
50     
51      tra(nlci,:,:,:) = alpha1 * tratemp(nlci,:,:,:) + alpha2 * tratemp(nlci-1,:,:,:)
52     
53    Do jn=1,jptra 
54      Do jk=1,jpk     
55      Do jj=1,jpj
56        IF (umask(nlci-2,jj,jk).EQ.0.) THEN
57        tra(nlci-1,jj,jk,jn) = tra(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk)
58        ELSE
59        tra(nlci-1,jj,jk,jn)=(alpha4*tra(nlci,jj,jk,jn)+alpha3*tra(nlci-2,jj,jk,jn))*tmask(nlci-1,jj,jk)
60         IF (un(nlci-2,jj,jk).GT.0.) THEN
61          tra(nlci-1,jj,jk,jn)=(alpha6*tra(nlci-2,jj,jk,jn)+alpha5*tra(nlci,jj,jk,jn) &
62                               +alpha7*tra(nlci-3,jj,jk,jn))*tmask(nlci-1,jj,jk)
63         ENDIF
64        ENDIF
65      End Do
66      enddo 
67    END DO
68      ENDIF       
69     
70      If ((nbondj == 1).OR.(nbondj == 2)) THEN
71     
72      tra(:,nlcj,:,:) = alpha1 * tratemp(:,nlcj,:,:) + alpha2 * tratemp(:,nlcj-1,:,:)
73 
74   DO jn=1, jptra           
75      Do jk=1,jpk     
76      Do ji=1,jpi
77        IF (vmask(ji,nlcj-2,jk).EQ.0.) THEN
78        tra(ji,nlcj-1,jk,jn) = tra(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk)
79        ELSE
80        tra(ji,nlcj-1,jk,jn)=(alpha4*tra(ji,nlcj,jk,jn)+alpha3*tra(ji,nlcj-2,jk,jn))*tmask(ji,nlcj-1,jk)       
81          IF (vn(ji,nlcj-2,jk) .GT. 0.) THEN
82           tra(ji,nlcj-1,jk,jn)=(alpha6*tra(ji,nlcj-2,jk,jn)+alpha5*tra(ji,nlcj,jk,jn) &
83                                +alpha7*tra(ji,nlcj-3,jk,jn))*tmask(ji,nlcj-1,jk)
84          ENDIF
85        ENDIF
86      End Do
87      enddo
88   END DO
89      ENDIF
90
91      IF ((nbondi == -1).OR.(nbondi == 2)) THEN
92     
93      tra(1,:,:,:) = alpha1 * tratemp(1,:,:,:) + alpha2 * tratemp(2,:,:,:)
94     
95     DO jn=1, jptra
96      Do jk=1,jpk     
97      Do jj=1,jpj
98        IF (umask(2,jj,jk).EQ.0.) THEN
99        tra(2,jj,jk,jn) = tra(1,jj,jk,jn) * tmask(2,jj,jk)
100        ELSE
101        tra(2,jj,jk,jn)=(alpha4*tra(1,jj,jk,jn)+alpha3*tra(3,jj,jk,jn))*tmask(2,jj,jk)       
102         IF (un(2,jj,jk).LT.0.) THEN
103           tra(2,jj,jk,jn)=(alpha6*tra(3,jj,jk,jn)+alpha5*tra(1,jj,jk,jn) &
104                           +alpha7*tra(4,jj,jk,jn))*tmask(2,jj,jk)
105         ENDIF
106        ENDIF
107      End Do
108      enddo
109     END DO
110      ENDIF
111      IF ((nbondj == -1).OR.(nbondj == 2)) THEN
112     
113      tra(:,1,:,:) = alpha1 * tratemp(:,1,:,:) + alpha2 * tratemp(:,2,:,:)
114           
115   DO jn=1, jptra 
116    Do jk=1,jpk     
117      Do ji=1,jpi
118        IF (vmask(ji,2,jk).EQ.0.) THEN
119        tra(ji,2,jk,jn)=tra(ji,1,jk,jn) * tmask(ji,2,jk)
120        ELSE
121        tra(ji,2,jk,jn)=(alpha4*tra(ji,1,jk,jn)+alpha3*tra(ji,3,jk,jn))*tmask(ji,2,jk)
122          IF (vn(ji,2,jk) .LT. 0.) THEN
123            tra(ji,2,jk,jn)=(alpha6*tra(ji,3,jk,jn)+alpha5*tra(ji,1,jk,jn)&
124                            +alpha7*tra(ji,4,jk,jn))*tmask(ji,2,jk)
125          ENDIF
126        ENDIF
127      End Do
128      enddo
129     END DO
130      ENDIF
131
132      End Subroutine Agrif_trc
133!
134!
135
136
137#else
138      CONTAINS
139      subroutine Agrif_TOP_Interp_empty
140
141      end subroutine Agrif_TOP_Interp_empty
142#endif
143      End Module agrif_top_interp
144
Note: See TracBrowser for help on using the repository browser.