My Project
bcond_ts.f90
Go to the documentation of this file.
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 !/===========================================================================/
13 ! Copyright (c) 2007, The University of Massachusetts Dartmouth
14 ! Produced at the School of Marine Science & Technology
15 ! Marine Ecosystem Dynamics Modeling group
16 ! All rights reserved.
17 !
18 ! FVCOM has been developed by the joint UMASSD-WHOI research team. For
19 ! details of authorship and attribution of credit please see the FVCOM
20 ! technical manual or contact the MEDM group.
21 !
22 !
23 ! This file is part of FVCOM. For details, see http://fvcom.smast.umassd.edu
24 ! The full copyright notice is contained in the file COPYRIGHT located in the
25 ! root directory of the FVCOM code. This original header must be maintained
26 ! in all distributed versions.
27 !
28 ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29 ! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
30 ! THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31 ! PURPOSE ARE DISCLAIMED.
32 !
33 !/---------------------------------------------------------------------------/
34 ! CVS VERSION INFORMATION
35 ! $Id$
36 ! $Name$
37 ! $Revision$
38 !/===========================================================================/
39 
40 !==============================================================================|
41 ! Set Boundary Conditions on Temperature and Salinity |
42 ! NCON2 = 1: SET CONDITIONS SPECIFIC TO TEMPERATURE |
43 ! NCON2 = 2: SET CONDITIONS SPECIFIC TO SALINITY |
44 !==============================================================================|
45 
46 SUBROUTINE bcond_ts(NCON2)
47 
48  !------------------------------------------------------------------------------|
49  USE all_vars
50  USE bcs
51  USE mod_utils
52  USE mod_obcs
53  USE mod_force
54 
55  IMPLICIT NONE
56  REAL(SP) :: S2D,S2D_NEXT,S2D_OBC,T2D,T2D_NEXT,T2D_OBC,XFLUX2D,TMP,RAMP_TS
57 
58 
59  INTEGER :: I,J,K,J1,J11,J22,NCON2
60  REAL(SP), ALLOCATABLE :: TTMP(:,:),STMP(:,:)
61 
62  REAL(SP) ::TMAX,TMIN,SMAX,SMIN
63 
64  !------------------------------------------------------------------------------|
65 
66  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "Start: bcond_ts"
67 
68  !
69  !--SET CONDITIONS FOR FRESH WATER INFLOW---------------------------------------|
70  !
71  IF(river_ts_setting == 'specified') THEN
72  IF(numqbc > 0) THEN
73  IF(river_inflow_location == 'node') THEN
74  DO i=1,numqbc
75  j11=inodeq(i)
76  DO k=1,kbm1
77  tf1(j11,k)=tdis(i)
78  sf1(j11,k)=sdis(i)
79  END DO
80  END DO
81  ELSE IF(river_inflow_location == 'edge') THEN
82  DO i=1,numqbc
83  j11=n_icellq(i,1)
84  j22=n_icellq(i,2)
85  DO k=1,kbm1
86  tf1(j11,k)=tdis(i)
87  sf1(j11,k)=sdis(i)
88  tf1(j22,k)=tdis(i)
89  sf1(j22,k)=sdis(i)
90  END DO
91  END DO
92  END IF
93  END IF
94  END IF
95 
96 
97  IF(.NOT. obc_on) RETURN
98 
99 
100  !
101  ! SET TEMPERATURE CONDITIONS ON OUTER BOUNDARY
102  !
103  IF(ncon2 == 1) THEN
104 
105  IF(obc_temp_nudging) CALL update_obc_temp(inttime,temp_obc)
106 
107  ALLOCATE(ttmp(iobcn,kbm1)); ttmp = 0.0_sp
108  DO i=1,iobcn
109  j=i_obc_n(i)
110  j1=next_obc(i)
111  t2d=0.0_sp
112  t2d_next=0.0_sp
113  xflux2d=0.0_sp
114  DO k=1,kbm1
115  t2d=t2d+t1(j,k)*dz(j,k)
116  t2d_next=t2d_next+tf1(j1,k)*dz(j1,k)
117  xflux2d=xflux2d+xflux_obc(i,k) !*DZ(J,K)
118  END DO
119 
120  ! IF THE FLOW IS OUT OF THE DOMAIN
121  IF(uard_obcn(i) > 0.0_sp) THEN
122 
123  tmp=xflux2d+t2d*uard_obcn(i)
124  t2d_obc=(t2d*dt(j)-tmp*dti/art1(j))/d(j)
125 
126  CALL bcond_t_perturbation(t2d_next,t2d,ttmp,i,j,j1)
127 
128  DO k=1,kbm1
129  tf1(j,k)=t2d_obc+ttmp(i,k)
130  ! TF1(J,K)=T2D_OBC+(TF1(J1,K)-T2D_NEXT)
131  END DO
132 
133  DO k=1,kbm1
134  tmax = maxval(t1(nbsn(j,1:ntsn(j)),k))
135  tmin = minval(t1(nbsn(j,1:ntsn(j)),k))
136 
137  IF(k == 1)THEN
138  tmax = max(tmax,(t1(j,k)*dz(j,k+1)+t1(j,k+1)*dz(j,k))/ &
139  (dz(j,k)+dz(j,k+1)))
140  tmin = min(tmin,(t1(j,k)*dz(j,k+1)+t1(j,k+1)*dz(j,k))/ &
141  (dz(j,k)+dz(j,k+1)))
142  ELSE IF(k == kbm1)THEN
143  tmax = max(tmax,(t1(j,k)*dz(j,k-1)+t1(j,k-1)*dz(j,k))/ &
144  (dz(j,k)+dz(j,k-1)))
145  tmin = min(tmin,(t1(j,k)*dz(j,k-1)+t1(j,k-1)*dz(j,k))/ &
146  (dz(j,k)+dz(j,k-1)))
147  ELSE
148  tmax = max(tmax,(t1(j,k)*dz(j,k-1)+t1(j,k-1)*dz(j,k))/ &
149  (dz(j,k)+dz(j,k-1)), &
150  (t1(j,k)*dz(j,k+1)+t1(j,k+1)*dz(j,k))/ &
151  (dz(j,k)+dz(j,k+1)))
152  tmin = min(tmin,(t1(j,k)*dz(j,k-1)+t1(j,k-1)*dz(j,k))/ &
153  (dz(j,k)+dz(j,k-1)), &
154  (t1(j,k)*dz(j,k+1)+t1(j,k+1)*dz(j,k))/ &
155  (dz(j,k)+dz(j,k+1)))
156  END IF
157 
158  IF(tmin-tf1(j,k) > 0.0_sp)tf1(j,k) = tmin
159  IF(tf1(j,k)-tmax > 0.0_sp)tf1(j,k) = tmax
160 
161  END DO
162 
163  else! IF THE FLOW IS INTO THE DOMAIN
164 
165  IF(obc_temp_nudging) THEN
166  DO k=1,kbm1
167  tf1(j,k) = t1(j,k) - obc_temp_nudging_timescale*ramp*(t1(j,k)&
168  &-temp_obc(i,k))
169  END DO
170  ELSE
171  DO k=1,kbm1
172  tf1(j,k) = t1(j,k)
173  END DO
174  END IF
175 
176  END IF
177 
178  END DO
179  DEALLOCATE(ttmp)
180 
181 
182  !
183  ! SET SALINITY CONDITIONS ON OUTER BOUNDARY
184  !
185  ELSE IF(ncon2 == 2) THEN
186 
187  IF (obc_salt_nudging) CALL update_obc_salt(inttime,salt_obc)
188 
189  ALLOCATE(stmp(iobcn,kbm1)); stmp = 0.0_sp
190  DO i=1,iobcn
191  j=i_obc_n(i)
192  j1=next_obc(i)
193  s2d=0.0_sp
194  s2d_next=0.0_sp
195  xflux2d=0.0_sp
196  DO k=1,kbm1
197  s2d=s2d+s1(j,k)*dz(j,k)
198  s2d_next=s2d_next+sf1(j1,k)*dz(j1,k)
199  xflux2d=xflux2d+xflux_obc(i,k) !*DZ(J,K)
200  END DO
201 
202  ! IF THE FLOW IS OUT OF THE DOMAIN
203  IF(uard_obcn(i) > 0.0_sp) THEN
204  tmp=xflux2d+s2d*uard_obcn(i)
205  s2d_obc=(s2d*dt(j)-tmp*dti/art1(j))/d(j)
206 
207  CALL bcond_s_perturbation(s2d_next,s2d,stmp,i,j,j1)
208 
209  DO k=1,kbm1
210  sf1(j,k)=s2d_obc+stmp(i,k)
211  ! SF1(J,K)=S2D_OBC+(SF1(J1,K)-S2D_NEXT)
212  END DO
213 
214  DO k=1,kbm1
215  smax = maxval(s1(nbsn(j,1:ntsn(j)),k))
216  smin = minval(s1(nbsn(j,1:ntsn(j)),k))
217 
218  IF(k == 1)THEN
219  smax = max(smax,(s1(j,k)*dz(j,k+1)+s1(j,k+1)*dz(j,k))/ &
220  (dz(j,k)+dz(j,k+1)))
221  smin = min(smin,(s1(j,k)*dz(j,k+1)+s1(j,k+1)*dz(j,k))/ &
222  (dz(j,k)+dz(j,k+1)))
223  ELSE IF(k == kbm1)THEN
224  smax = max(smax,(s1(j,k)*dz(j,k-1)+s1(j,k-1)*dz(j,k))/ &
225  (dz(j,k)+dz(j,k-1)))
226  smin = min(smin,(s1(j,k)*dz(j,k-1)+s1(j,k-1)*dz(j,k))/ &
227  (dz(j,k)+dz(j,k-1)))
228  ELSE
229  smax = max(smax,(s1(j,k)*dz(j,k-1)+s1(j,k-1)*dz(j,k))/ &
230  (dz(j,k)+dz(j,k-1)), &
231  (s1(j,k)*dz(j,k+1)+s1(j,k+1)*dz(j,k))/ &
232  (dz(j,k)+dz(j,k+1)))
233  smin = min(smin,(s1(j,k)*dz(j,k-1)+s1(j,k-1)*dz(j,k))/ &
234  (dz(j,k)+dz(j,k-1)), &
235  (s1(j,k)*dz(j,k+1)+s1(j,k+1)*dz(j,k))/ &
236  (dz(j,k)+dz(j,k+1)))
237  END IF
238 
239  IF(smin-sf1(j,k) > 0.0_sp) sf1(j,k) = smin
240  IF(sf1(j,k)-smax > 0.0_sp) sf1(j,k) = smax
241 
242  END DO
243  ELSE ! IF THE FLOW IS INTO THE DOMAIN
244 
245  IF (obc_salt_nudging) THEN
246  DO k=1,kbm1
247  sf1(j,k) = s1(j,k) - obc_salt_nudging_timescale*ramp*(s1(j,k)&
248  &-salt_obc(i,k))
249  END DO
250  ELSE
251  DO k=1,kbm1
252  sf1(j,k) = s1(j,k)
253  END DO
254  END IF
255 
256  END IF
257  END DO
258  DEALLOCATE(stmp)
259  ELSE
260  print*, 'NCON2 NOT IN THE LIST'
261  print*, 'MUST BE 1 OR 2'
262  CALL pstop
263  END IF
264 
265 
266 
267  !
268  !--SET BOUNDARY CONDITIONS-----------------------------------------------------|
269  !
270  DO k=1,kbm1
271  t(0,k)=0.0_sp
272  s(0,k)=0.0_sp
273  END DO
274 
275  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "End: bcond_ts"
276 
277  RETURN
278 END SUBROUTINE bcond_ts
279 !==============================================================================|
integer, dimension(:), allocatable, target ntsn
Definition: mod_main.f90:1023
real(sp), dimension(:), allocatable, target d
Definition: mod_main.f90:1132
subroutine bcond_t_perturbation(T2D_NEXT, T2D, TTMP, I, J, J1)
Definition: mod_obcs.f90:870
real(sp), dimension(:,:), allocatable, target s
Definition: mod_main.f90:1288
logical function dbg_set(vrb)
Definition: mod_utils.f90:182
real(sp), dimension(:), allocatable, target art1
Definition: mod_main.f90:1010
real(sp), dimension(:,:), allocatable, target t1
Definition: mod_main.f90:1307
subroutine, public update_obc_temp(NOW, TEMP)
Definition: mod_force.f90:7046
real(sp), dimension(:,:), allocatable xflux_obc
Definition: mod_obcs.f90:113
real(sp), dimension(:,:), allocatable, target s1
Definition: mod_main.f90:1308
subroutine, public update_obc_salt(NOW, SALT)
Definition: mod_force.f90:7013
real(sp), dimension(:), allocatable, target sdis
Definition: mod_main.f90:1225
real(sp), dimension(:,:), allocatable temp_obc
Definition: mod_obcs.f90:91
integer, dimension(:), allocatable next_obc
Definition: mod_obcs.f90:78
integer iobcn
Definition: mod_main.f90:1777
real(sp), dimension(:,:), allocatable, target tf1
Definition: mod_main.f90:1310
real(sp), dimension(:), allocatable uard_obcn
Definition: mod_obcs.f90:112
subroutine pstop
Definition: mod_utils.f90:273
subroutine bcond_ts(NCON2)
Definition: bcond_ts.f90:47
integer, dimension(:), allocatable i_obc_n
Definition: mod_main.f90:1779
real(sp), dimension(:,:), allocatable, target sf1
Definition: mod_main.f90:1311
integer, dimension(:,:), allocatable, target n_icellq
Definition: mod_main.f90:1216
real(sp), dimension(:,:), allocatable, target dz
Definition: mod_main.f90:1092
integer, dimension(:,:), allocatable, target nbsn
Definition: mod_main.f90:1030
real(sp), dimension(:,:), allocatable, target t
Definition: mod_main.f90:1286
real(sp), dimension(:), allocatable, target tdis
Definition: mod_main.f90:1224
integer, parameter dbg_sbr
Definition: mod_utils.f90:69
integer, dimension(:), allocatable, target inodeq
Definition: mod_main.f90:1214
subroutine bcond_s_perturbation(S2D_NEXT, S2D, STMP, I, J, J1)
Definition: mod_obcs.f90:949
real(sp), dimension(:,:), allocatable salt_obc
Definition: mod_obcs.f90:92
real(sp), dimension(:), allocatable, target dt
Definition: mod_main.f90:1133