1 | !============================================================================ |
---|
2 | ! SET_AMBIENT_STRATIFICATION |
---|
3 | ! FUNCTION TO DEFINE s1_bar [K] & s2_bar [ppt] |
---|
4 | subroutine set_ambient_stratification |
---|
5 | |
---|
6 | ! routine to set the ambient profiles for the scalars s1 and s2 |
---|
7 | ! where total_s1 = s1_bar(x,z) + s1(x,y,z,t) |
---|
8 | ! and total_s2 = s2_bar(x,z) + s2(x,y,z,t) |
---|
9 | |
---|
10 | use grid_info |
---|
11 | use user_parameters ! for z_N,z_N_scale,Smax,Smin,Tmax,Tmin,dTdz |
---|
12 | use dependent_variables ! s1_bar, s2_bar,rho_bar |
---|
13 | use dimensional_scales ! s1_scale, s2_scale |
---|
14 | use counters_flags_etc |
---|
15 | use mpi_parameters |
---|
16 | implicit none |
---|
17 | include '../input/problem_size.h' |
---|
18 | include 'mpif.h' |
---|
19 | |
---|
20 | !!! local variables |
---|
21 | real :: xpos,zpos,Temp,Salinity |
---|
22 | integer :: kglobal |
---|
23 | real,dimension(:,:),allocatable :: tabforcing |
---|
24 | |
---|
25 | |
---|
26 | print*,'Ambient_stratification, Lz',Lz |
---|
27 | |
---|
28 | if ( pomme_data_flag == 'no') then |
---|
29 | |
---|
30 | |
---|
31 | !!! these are just values pulled out of a hat for testing |
---|
32 | Smax = 35.0 ! [psu] |
---|
33 | Smin = 35.0 ! [psu] |
---|
34 | Tmax = 15.0 ! [deg C] |
---|
35 | Tmin = 10.0 ! [deg C] !!! must be the same as T0 in EOS.f90 |
---|
36 | |
---|
37 | !!! defined in params.h |
---|
38 | !!! dTdz=1.4133829e-3*4 |
---|
39 | |
---|
40 | !!! we'll use s1 for temperature (deg C) and s2 for salinity (g/kg or ppt) |
---|
41 | ! both of these test profiles are stable |
---|
42 | do k=1,locnz |
---|
43 | do i=1,nx |
---|
44 | |
---|
45 | zpos = Grid(0)%z(i,k)*L_scale ! [m] |
---|
46 | Salinity= Smin + (Smax-Smin)/Lz * zpos |
---|
47 | Temp = Tmin + dTdz * zpos !!!!!(Tmax-Tmin)/Lz * zpos |
---|
48 | |
---|
49 | s1_bar(i,k) = Temp / s1_scale |
---|
50 | s2_bar(i,k) = Salinity / s2_scale |
---|
51 | |
---|
52 | enddo |
---|
53 | enddo |
---|
54 | |
---|
55 | else |
---|
56 | |
---|
57 | !!! xlv lecture profil vertical [T,S] POMME |
---|
58 | !============================================ |
---|
59 | allocate (tabforcing(nz,2)) |
---|
60 | |
---|
61 | if(myid==0) write(0,*) '... Reading POMME data into file : ' |
---|
62 | if(myid==0) print*,' --> ',trim(pomme_filename) |
---|
63 | open(911,file=pomme_filename,status='old') |
---|
64 | do k=1,nz |
---|
65 | read(911,*) tabforcing(k,1),tabforcing(k,2) |
---|
66 | enddo |
---|
67 | close(911) |
---|
68 | |
---|
69 | do k=1,locnz |
---|
70 | do i=1,nx |
---|
71 | kglobal = k + myid*locnz |
---|
72 | s1_bar(i,k)=tabforcing(kglobal,1) |
---|
73 | s2_bar(i,k)=tabforcing(kglobal,2) |
---|
74 | enddo |
---|
75 | enddo |
---|
76 | |
---|
77 | s1_bar = s1_bar / s1_scale |
---|
78 | s2_bar = s2_bar / s2_scale |
---|
79 | |
---|
80 | if(myid==0) write(0,*) '... POMME data saved....' |
---|
81 | |
---|
82 | deallocate( tabforcing ) |
---|
83 | !=================================== |
---|
84 | |
---|
85 | endif |
---|
86 | |
---|
87 | |
---|
88 | print*,'MINVAL(T)=',minval(s1_bar),'MAXVAL(T)=',maxval(s1_bar) |
---|
89 | print*,'MINVAL(S)=',minval(s2_bar),'MAXVAL(S)=',maxval(s2_bar) |
---|
90 | |
---|
91 | |
---|
92 | |
---|
93 | return |
---|
94 | end subroutine set_ambient_stratification |
---|
95 | !============================================================================ |
---|
96 | |
---|
97 | |
---|
98 | |
---|
99 | !============================================================================= |
---|
100 | ! TEMPD |
---|
101 | ! FUNCTION TO GET INTERPOLATED VALUE OF TEMP FROM GRIDDED DATA |
---|
102 | ! |
---|
103 | REAL FUNCTION TEMPD(ZK) |
---|
104 | ! |
---|
105 | PARAMETER(NT=23) |
---|
106 | ! |
---|
107 | REAL ZK |
---|
108 | ! |
---|
109 | REAL ZD(NT),TD(NT) |
---|
110 | ! |
---|
111 | DATA IZTOPT/NT/ |
---|
112 | ! |
---|
113 | !!! DATA ZD/-60.,-55.,-50.,-47.2,-45.,-44.3,-42.2,-40.,-38.5,-35., & |
---|
114 | !!! -34.5,-32.5,-30.,-28.9,-27.4,-25.,-24.1,-20.,-17.6,-15.,-10., & |
---|
115 | !!! -5.,0./ |
---|
116 | DATA ZD/0.,5.,10.,12.8,15.,15.7,17.8,20.,21.5,25.,25.5,27.5,30.,31.1, & |
---|
117 | 32.6,35.,35.9,40.,42.4,45.,50.,55.,60./ |
---|
118 | DATA TD/-1.15,-1.15,-1.15,-1.05,-1.16,-1.18,-0.92,-0.73,-0.55, & |
---|
119 | -0.05,-0.02,-0.10,-0.28,-0.45,-0.70,-1.26,-1.43,-1.58,-1.61, & |
---|
120 | -1.61,-1.62,-1.62,-1.62/ |
---|
121 | ! |
---|
122 | !!! ZD(:) = 60. + ZD(:) |
---|
123 | TEMPD = FK(ZK,ZD,TD,NT,IZTOPT) |
---|
124 | ! |
---|
125 | RETURN |
---|
126 | END |
---|
127 | !============================================================================== |
---|
128 | |
---|
129 | |
---|
130 | |
---|
131 | !============================================================================ |
---|
132 | ! SALTD |
---|
133 | ! FUNCTION TO GET INTERPOLATED VALUE OF SALINITY FROM GRIDDED DATA |
---|
134 | ! |
---|
135 | REAL FUNCTION SALTD(ZK) |
---|
136 | ! |
---|
137 | PARAMETER(NS=20) |
---|
138 | ! |
---|
139 | REAL ZK |
---|
140 | ! |
---|
141 | REAL ZD(NS),SD(NS) |
---|
142 | ! |
---|
143 | DATA IZTOPS/NS/ |
---|
144 | ! |
---|
145 | !!! DATA ZD/-60.,-55.,-50.,-47.1,-45.,-43.3,-40.,-37.9,-35.,-32.7, & |
---|
146 | !!! -30.,-28.9,-27.8,-25.,-24.3,-20.,-15.,-10.,-5.,0./ |
---|
147 | DATA ZD/0.,5.,10.,12.9,15.,16.7,20.,22.1,25.,27.3,30.,31.1,32.2, & |
---|
148 | 35.,35.7,40.,45.,50.,55.,60./ |
---|
149 | DATA SD/31.83,31.83,31.83,31.82,31.78,31.75,31.72,31.68,31.58, & |
---|
150 | 31.53,31.44,31.38,31.27,30.96,30.87,30.80,30.79,3*30.78/ |
---|
151 | ! |
---|
152 | !!! ZD(:) = 60. + ZD(:) |
---|
153 | SALTD = FK(ZK,ZD,SD,NS,IZTOPS) |
---|
154 | ! |
---|
155 | RETURN |
---|
156 | END |
---|
157 | !============================================================================= |
---|
158 | |
---|
159 | |
---|
160 | |
---|
161 | !============================================================================== |
---|
162 | ! FK |
---|
163 | ! FK IS A FUNCTION THAT USES LINEAR INTERPOLATION TO FIND FK, |
---|
164 | ! GIVEN ZK AND THE ARRAYS Z AND F. FOR EXAMPLE, IN ROUTINE |
---|
165 | ! DERIVS, BVF = FK(ALT,BVFZ,BVFF) WILL BE USED TO GET BVF AT ALT |
---|
166 | ! FROM THE ARRAYS BVFZ AND BVFF. |
---|
167 | REAL FUNCTION FK(ZK,Z,F,NZ,IZTOP) |
---|
168 | REAL Z(*), F(*) |
---|
169 | ! |
---|
170 | ! MAKE SURE Z(IZTOP) .GE. ZK |
---|
171 | !! PRINT 99, zk,nz,iztop |
---|
172 | !! 99 FORMAT('zk,nz,iztop = ',1pe15.5,2i15) |
---|
173 | 5 CONTINUE |
---|
174 | IF(ZK.GT.Z(IZTOP)) THEN |
---|
175 | IZTOP = IZTOP + 1 |
---|
176 | IF(IZTOP.GT.NZ) THEN |
---|
177 | WRITE(2,9) ZK,Z(NZ) |
---|
178 | 9 FORMAT(' ZK TOO HIGH. ZK,Z(NZ) = ',2(1PE15.5)) |
---|
179 | CLOSE(2) |
---|
180 | CLOSE(3) |
---|
181 | STOP |
---|
182 | ENDIF |
---|
183 | GO TO 5 |
---|
184 | ENDIF |
---|
185 | ! |
---|
186 | IF(ZK.EQ.Z(IZTOP)) THEN |
---|
187 | FK = F(IZTOP) |
---|
188 | RETURN |
---|
189 | ENDIF |
---|
190 | ! |
---|
191 | ! FIND IZK SUCH THAT Z(IZK) .GT. ZK .GE. Z(IZK-1) |
---|
192 | DO 100 IZ=IZTOP,2,-1 |
---|
193 | IZM1 = IZ - 1 |
---|
194 | IF(Z(IZ).GT.ZK .AND. ZK.GE.Z(IZM1)) THEN |
---|
195 | ZRATIO = (ZK - Z(IZM1)) / (Z(IZ) - Z(IZM1)) |
---|
196 | FK = F(IZM1) + ZRATIO * (F(IZ) - F(IZM1)) |
---|
197 | IZTOP = IZM1 + 1 |
---|
198 | RETURN |
---|
199 | ENDIF |
---|
200 | 100 CONTINUE |
---|
201 | ! |
---|
202 | ! ZK TOO LOW |
---|
203 | WRITE(2,109) ZK,Z(1) |
---|
204 | 109 FORMAT(' ZK TOO LOW. ZK,Z(1) = ',2(1PE15.5)) |
---|
205 | CLOSE(2) |
---|
206 | CLOSE(3) |
---|
207 | STOP |
---|
208 | ! |
---|
209 | END |
---|
210 | ! |
---|