source: palm/trunk/SOURCE/nudging.f90 @ 1757

Last change on this file since 1757 was 1757, checked in by maronga, 8 years ago

some changes in land surface model, radiation model, nudging and some minor updates

  • Property svn:keywords set to Id
File size: 19.8 KB
RevLine 
[1682]1!> @file nudging.f90
[1239]2!--------------------------------------------------------------------------------!
3! This file is part of PALM.
4!
5! PALM is free software: you can redistribute it and/or modify it under the terms
6! of the GNU General Public License as published by the Free Software Foundation,
7! either version 3 of the License, or (at your option) any later version.
8!
9! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
10! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
12!
13! You should have received a copy of the GNU General Public License along with
14! PALM. If not, see <http://www.gnu.org/licenses/>.
15!
[1310]16! Copyright 1997-2014 Leibniz Universitaet Hannover
[1239]17!--------------------------------------------------------------------------------!
18!
19! Current revisions:
20! ------------------
[1757]21! Bugfix: allow for using higher vertical resolution in nudging file than grid
22! spacing in the LES model
[1383]23!
24! Former revisions:
25! -----------------
26! $Id: nudging.f90 1757 2016-02-22 15:49:32Z maronga $
27!
[1683]28! 1682 2015-10-07 23:56:08Z knoop
29! Code annotations made doxygen readable
30!
[1399]31! 1398 2014-05-07 11:15:00Z heinze
32! Subroutine nudge_ref is extended to set u_init and v_init to the current
33! nudging profiles
34!
[1383]35! 1382 2014-04-30 12:15:41Z boeske
[1382]36! Changed the weighting factor that is used in the summation of nudging
37! tendencies for profile data output from weight_pres to weight_substep,
38! added Neumann boundary conditions for profile data output of nudging terms at
39! nzt+1
[1366]40!
[1381]41! 1380 2014-04-28 12:40:45Z heinze
42! Subroutine nudge_ref added to account for proper upper scalar boundary
43! conditions in case of nudging
44!
[1366]45! 1365 2014-04-22 15:03:56Z boeske
[1365]46! Variable t renamed nt, variable currtnudge renamed tmp_tnudge,
47! summation of nudging tendencies for data output added
48! +sums_ls_l, tmp_tend
49! Added new subroutine calc_tnudge, which calculates the current nudging time
50! scale at each time step
[1354]51!
[1356]52! 1355 2014-04-10 10:21:29Z heinze
53! Error message specified.
54!
[1354]55! 1353 2014-04-08 15:21:23Z heinze
56! REAL constants provided with KIND-attribute
57!
[1321]58! 1320 2014-03-20 08:40:49Z raasch
[1320]59! ONLY-attribute added to USE-statements,
60! kind-parameters added to all INTEGER and REAL declaration statements,
61! kinds are defined in new module kinds,
62! old module precision_kind is removed,
63! revision history before 2012 removed,
64! comment fields (!:) to be used for variable explanations added to
65! all variable declaration statements
[1239]66!
[1319]67! 1318 2014-03-17 13:35:16Z raasch
68! module interfaces removed
69!
[1269]70! 1268 2013-12-12 09:47:53Z heinze
71! bugfix: argument of calc_mean_profile corrected
72!
[1252]73! 1251 2013-11-07 08:14:30Z heinze
74! bugfix: calculate dtm and dtp also in vector version
75!
[1250]76! 1249 2013-11-06 10:45:47Z heinze
77! remove call of user module
78! reformatting
79!
[1242]80! 1241 2013-10-30 11:36:58Z heinze
81! Initial revision
[1239]82!
83! Description:
84! ------------
[1682]85!> Nudges u, v, pt and q to given profiles on a relaxation timescale tnudge.
86!> Profiles are read in from NUDGIN_DATA. Code is based on Neggers et al. (2012)
87!> and also part of DALES and UCLA-LES.
[1239]88!--------------------------------------------------------------------------------!
[1682]89 MODULE nudge_mod
90 
[1239]91
92    PRIVATE
[1380]93    PUBLIC init_nudge, calc_tnudge, nudge, nudge_ref
[1239]94    SAVE
95
96    INTERFACE nudge
97       MODULE PROCEDURE nudge
98       MODULE PROCEDURE nudge_ij
99    END INTERFACE nudge
100
101 CONTAINS
102
[1682]103!------------------------------------------------------------------------------!
104! Description:
105! ------------
106!> @todo Missing subroutine description.
107!------------------------------------------------------------------------------!
[1239]108    SUBROUTINE init_nudge
109
[1320]110       USE arrays_3d,                                                          &
[1365]111           ONLY:  ptnudge, qnudge, timenudge, tmp_tnudge, tnudge, unudge,      &
112                  vnudge, wnudge, zu
[1239]113
[1320]114       USE control_parameters,                                                 &
115           ONLY:  dt_3d, lptnudge, lqnudge, lunudge, lvnudge, lwnudge,         &
116                   message_string, ntnudge
117
118       USE indices,                                                            &
119           ONLY:  nzb, nzt
120
121       USE kinds
122
[1239]123       IMPLICIT NONE
124
125
[1682]126       INTEGER(iwp) ::  finput = 90  !<
127       INTEGER(iwp) ::  ierrn        !<
128       INTEGER(iwp) ::  k            !<
129       INTEGER(iwp) ::  nt            !<
[1239]130
[1682]131       CHARACTER(1) ::  hash     !<
[1320]132
[1682]133       REAL(wp) ::  highheight   !<
134       REAL(wp) ::  highqnudge   !<
135       REAL(wp) ::  highptnudge  !<
136       REAL(wp) ::  highunudge   !<
137       REAL(wp) ::  highvnudge   !<
138       REAL(wp) ::  highwnudge   !<
139       REAL(wp) ::  hightnudge   !<
[1320]140
[1682]141       REAL(wp) ::  lowheight    !<
142       REAL(wp) ::  lowqnudge    !<
143       REAL(wp) ::  lowptnudge   !<
144       REAL(wp) ::  lowunudge    !<
145       REAL(wp) ::  lowvnudge    !<
146       REAL(wp) ::  lowwnudge    !<
147       REAL(wp) ::  lowtnudge    !<
[1320]148
[1682]149       REAL(wp) ::  fac          !<
[1320]150
[1239]151       ALLOCATE( ptnudge(nzb:nzt+1,1:ntnudge), qnudge(nzb:nzt+1,1:ntnudge), &
152                 tnudge(nzb:nzt+1,1:ntnudge), unudge(nzb:nzt+1,1:ntnudge),  &
153                 vnudge(nzb:nzt+1,1:ntnudge), wnudge(nzb:nzt+1,1:ntnudge)  )
154
[1365]155       ALLOCATE( tmp_tnudge(nzb:nzt) )
156
[1239]157       ALLOCATE( timenudge(0:ntnudge) )
158
[1353]159       ptnudge = 0.0_wp; qnudge = 0.0_wp; tnudge = 0.0_wp; unudge = 0.0_wp
160       vnudge = 0.0_wp; wnudge = 0.0_wp; timenudge = 0.0_wp
[1365]161!
162!--    Initialize array tmp_nudge with a current nudging time scale of 6 hours
163       tmp_tnudge = 21600.0_wp
[1239]164
[1365]165       nt = 0
[1249]166       OPEN ( finput, FILE='NUDGING_DATA', STATUS='OLD', &
167              FORM='FORMATTED', IOSTAT=ierrn )
[1239]168
[1249]169       IF ( ierrn /= 0 )  THEN
[1239]170          message_string = 'file NUDGING_DATA does not exist'
171          CALL message( 'nudging', 'PA0365', 1, 2, 0, 6, 0 )
172       ENDIF
173
174       ierrn = 0
175
176 rloop:DO
[1365]177          nt = nt + 1
[1239]178          hash = "#"
[1320]179          ierrn = 1 ! not zero
[1239]180!
181!--       Search for the next line consisting of "# time",
182!--       from there onwards the profiles will be read
183          DO WHILE ( .NOT. ( hash == "#" .AND. ierrn == 0 ) ) 
184         
[1365]185            READ ( finput, *, IOSTAT=ierrn ) hash, timenudge(nt)
[1249]186            IF ( ierrn < 0 )  EXIT rloop
[1239]187
188          ENDDO
189
190          ierrn = 0
[1249]191          READ ( finput, *, IOSTAT=ierrn ) lowheight, lowtnudge, lowunudge,   &
192                                           lowvnudge, lowwnudge , lowptnudge, &
193                                           lowqnudge
[1239]194
[1249]195          IF ( ierrn /= 0 )  THEN
[1239]196             message_string = 'errors in file NUDGING_DATA'
197             CALL message( 'nudging', 'PA0366', 1, 2, 0, 6, 0 )
198          ENDIF
199
200          ierrn = 0
[1249]201          READ ( finput, *, IOSTAT=ierrn ) highheight, hightnudge, highunudge,   &
202                                           highvnudge, highwnudge , highptnudge, &
203                                           highqnudge
[1239]204
[1249]205          IF ( ierrn /= 0 )  THEN
[1239]206             message_string = 'errors in file NUDGING_DATA'
207             CALL message( 'nudging', 'PA0366', 1, 2, 0, 6, 0 )
208          ENDIF
209
210          DO  k = nzb, nzt+1
[1757]211             DO WHILE ( highheight < zu(k) )
[1239]212                lowheight  = highheight
213                lowtnudge  = hightnudge
214                lowunudge  = highunudge
215                lowvnudge  = highvnudge
216                lowwnudge  = highwnudge
217                lowptnudge = highptnudge
218                lowqnudge  = highqnudge
219 
220                ierrn = 0
[1249]221                READ ( finput, *, IOSTAT=ierrn )  highheight , hightnudge , &
222                                                  highunudge , highvnudge , &
223                                                  highwnudge , highptnudge, &
224                                                  highqnudge
225                IF (ierrn /= 0 )  THEN
[1355]226                   WRITE( message_string, * ) 'zu(nzt+1) = ', zu(nzt+1), 'm is ',&
227                        'higher than the maximum height in NUDING_DATA which ',  &
228                        'is ', lowheight, 'm. Interpolation on PALM ',           &
229                        'grid is not possible.'
230                   CALL message( 'nudging', 'PA0364', 1, 2, 0, 6, 0 )
[1239]231                ENDIF
[1757]232             ENDDO
[1239]233
234!
235!--          Interpolation of prescribed profiles in space
236
[1249]237             fac = ( highheight - zu(k) ) / ( highheight - lowheight )
[1239]238
[1365]239             tnudge(k,nt)  = fac * lowtnudge  + ( 1.0_wp - fac ) * hightnudge
240             unudge(k,nt)  = fac * lowunudge  + ( 1.0_wp - fac ) * highunudge
241             vnudge(k,nt)  = fac * lowvnudge  + ( 1.0_wp - fac ) * highvnudge
242             wnudge(k,nt)  = fac * lowwnudge  + ( 1.0_wp - fac ) * highwnudge
243             ptnudge(k,nt) = fac * lowptnudge + ( 1.0_wp - fac ) * highptnudge
244             qnudge(k,nt)  = fac * lowqnudge  + ( 1.0_wp - fac ) * highqnudge
[1239]245          ENDDO
246
247       ENDDO rloop
248
[1249]249       CLOSE ( finput )
[1239]250
251!
252!--    Prevent nudging if nudging profiles exhibt too small values
[1241]253!--    not used so far
[1353]254       lptnudge  = ANY( ABS( ptnudge ) > 1.0e-8_wp )
255       lqnudge   = ANY( ABS( qnudge )  > 1.0e-8_wp )
256       lunudge   = ANY( ABS( unudge )  > 1.0e-8_wp )
257       lvnudge   = ANY( ABS( vnudge )  > 1.0e-8_wp )
258       lwnudge   = ANY( ABS( wnudge )  > 1.0e-8_wp )
[1239]259
260    END SUBROUTINE init_nudge
261
[1365]262
[1682]263!------------------------------------------------------------------------------!
264! Description:
265! ------------
266!> @todo Missing subroutine description.
267!------------------------------------------------------------------------------!
[1365]268    SUBROUTINE calc_tnudge ( time )
269
270       USE arrays_3d,                                                          &
271           ONLY:  timenudge, tmp_tnudge, tnudge
272
273       USE control_parameters,                                                 &
274           ONLY:  dt_3d 
275
276       USE indices,                                                            &
277           ONLY:  nzb, nzt
278
279       USE kinds
280
281       IMPLICIT NONE
282
283
[1682]284       REAL(wp) ::  dtm         !<
285       REAL(wp) ::  dtp         !<
286       REAL(wp) ::  time        !<
[1365]287
[1682]288       INTEGER(iwp) ::  k   !<
289       INTEGER(iwp) ::  nt  !<
[1365]290
291       nt = 1
292       DO WHILE ( time > timenudge(nt) )
293         nt = nt+1
294       ENDDO
295       IF ( time /= timenudge(1) ) THEN
296         nt = nt-1
297       ENDIF
298
299       dtm = ( time - timenudge(nt) ) / ( timenudge(nt+1) - timenudge(nt) )
300       dtp = ( timenudge(nt+1) - time ) / ( timenudge(nt+1) - timenudge(nt) )
301
302       DO  k = nzb, nzt
303          tmp_tnudge(k) = MAX( dt_3d, tnudge(k,nt) * dtp + tnudge(k,nt+1) * dtm )
304       ENDDO
305
306    END SUBROUTINE calc_tnudge
307
[1239]308!------------------------------------------------------------------------------!
[1682]309! Description:
310! ------------
311!> Call for all grid points
[1239]312!------------------------------------------------------------------------------!
313    SUBROUTINE nudge ( time, prog_var )
314
[1320]315       USE arrays_3d,                                                          &
[1365]316           ONLY:  pt, ptnudge, q, qnudge, tend, timenudge, tmp_tnudge, tnudge, &
317                  u, unudge, v, vnudge
[1239]318
[1320]319       USE control_parameters,                                                 &
[1365]320           ONLY:  dt_3d, intermediate_timestep_count, message_string
[1320]321
322       USE indices,                                                            &
323           ONLY:  nxl, nxr, nys, nyn, nzb, nzb_u_inner, nzt
324
[1365]325       USE kinds
[1320]326
327       USE statistics,                                                         &
[1382]328           ONLY:  hom, sums_ls_l, weight_substep
[1320]329
[1239]330       IMPLICIT NONE
331
[1682]332       CHARACTER (LEN=*) ::  prog_var  !<
[1239]333
[1682]334       REAL(wp) ::  tmp_tend    !<
335       REAL(wp) ::  dtm         !<
336       REAL(wp) ::  dtp         !<
337       REAL(wp) ::  time        !<
[1239]338
[1682]339       INTEGER(iwp) ::  i  !<
340       INTEGER(iwp) ::  j  !<
341       INTEGER(iwp) ::  k  !<
342       INTEGER(iwp) ::  nt  !<
[1239]343
344
[1365]345       nt = 1
346       DO WHILE ( time > timenudge(nt) )
347         nt = nt+1
[1251]348       ENDDO
349       IF ( time /= timenudge(1) ) THEN
[1365]350         nt = nt-1
[1251]351       ENDIF
352
[1365]353       dtm = ( time - timenudge(nt) ) / ( timenudge(nt+1) - timenudge(nt) )
354       dtp = ( timenudge(nt+1) - time ) / ( timenudge(nt+1) - timenudge(nt) )
[1251]355
[1239]356       SELECT CASE ( prog_var )
357
358          CASE ( 'u' )
359
360             DO  i = nxl, nxr
361                DO  j = nys, nyn
[1382]362
[1239]363                   DO  k = nzb_u_inner(j,i)+1, nzt
364
[1365]365                      tmp_tend = - ( hom(k,1,1,0) - ( unudge(k,nt) * dtp +     &
366                                     unudge(k,nt+1) * dtm ) ) / tmp_tnudge(k)
[1239]367
[1365]368                      tend(k,j,i) = tend(k,j,i) + tmp_tend
[1239]369
[1365]370                      sums_ls_l(k,6) = sums_ls_l(k,6) + tmp_tend *             &
[1382]371                                     weight_substep(intermediate_timestep_count)
[1239]372                   ENDDO
[1382]373                 
374                   sums_ls_l(nzt+1,6) = sums_ls_l(nzt,6)
375 
[1239]376                ENDDO
377            ENDDO
378
379          CASE ( 'v' )
380
381             DO  i = nxl, nxr
382                DO  j = nys, nyn
[1382]383
[1239]384                   DO  k = nzb_u_inner(j,i)+1, nzt
385
[1365]386                      tmp_tend = - ( hom(k,1,2,0) - ( vnudge(k,nt) * dtp +     &
387                                     vnudge(k,nt+1) * dtm ) ) / tmp_tnudge(k)
[1239]388
[1365]389                      tend(k,j,i) = tend(k,j,i) + tmp_tend
[1239]390
[1365]391                      sums_ls_l(k,7) = sums_ls_l(k,7) + tmp_tend *             &
[1382]392                                     weight_substep(intermediate_timestep_count)
[1239]393                   ENDDO
[1382]394                 
395                   sums_ls_l(nzt+1,7) = sums_ls_l(nzt,7)
396
[1239]397                ENDDO
398            ENDDO
399
400          CASE ( 'pt' )
401
402             DO  i = nxl, nxr
403                DO  j = nys, nyn
[1382]404
[1239]405                   DO  k = nzb_u_inner(j,i)+1, nzt
406
[1365]407                      tmp_tend = - ( hom(k,1,4,0) - ( ptnudge(k,nt) * dtp +    &
408                                     ptnudge(k,nt+1) * dtm ) ) / tmp_tnudge(k)
[1239]409
[1365]410                      tend(k,j,i) = tend(k,j,i) + tmp_tend
[1239]411
[1365]412                      sums_ls_l(k,4) = sums_ls_l(k,4) + tmp_tend *             &
[1382]413                                     weight_substep(intermediate_timestep_count)
[1239]414                   ENDDO
[1382]415
416                   sums_ls_l(nzt+1,4) = sums_ls_l(nzt,4)
417
[1239]418                ENDDO
419            ENDDO
420
421          CASE ( 'q' )
422
423             DO  i = nxl, nxr
424                DO  j = nys, nyn
[1382]425
[1239]426                   DO  k = nzb_u_inner(j,i)+1, nzt
427
[1365]428                      tmp_tend = - ( hom(k,1,41,0) - ( qnudge(k,nt) * dtp +    &
429                                     qnudge(k,nt+1) * dtm ) ) / tmp_tnudge(k)
[1239]430
[1365]431                      tend(k,j,i) = tend(k,j,i) + tmp_tend
[1239]432
[1365]433                      sums_ls_l(k,5) = sums_ls_l(k,5) + tmp_tend *             &
[1382]434                                     weight_substep(intermediate_timestep_count)
[1239]435                   ENDDO
[1382]436                 
437                   sums_ls_l(nzt+1,5) = sums_ls_l(nzt,5)
438
[1239]439                ENDDO
440            ENDDO
441
442          CASE DEFAULT
443             message_string = 'unknown prognostic variable "' // prog_var // '"'
444             CALL message( 'nudge', 'PA0367', 1, 2, 0, 6, 0 )
445
446       END SELECT
447
448    END SUBROUTINE nudge
449
450
451!------------------------------------------------------------------------------!
[1682]452! Description:
453! ------------
454!> Call for grid point i,j
[1239]455!------------------------------------------------------------------------------!
456
457    SUBROUTINE nudge_ij( i, j, time, prog_var )
458
[1320]459       USE arrays_3d,                                                          &
[1365]460           ONLY:  pt, ptnudge, q, qnudge, tend, timenudge, tmp_tnudge, tnudge, &
461                  u, unudge, v, vnudge
[1239]462
[1320]463       USE control_parameters,                                                 &
[1365]464           ONLY:  dt_3d, intermediate_timestep_count, message_string
[1320]465
466       USE indices,                                                            &
467           ONLY:  nxl, nxr, nys, nyn, nzb, nzb_u_inner, nzt
468
[1365]469       USE kinds
[1320]470
471       USE statistics,                                                         &
[1382]472           ONLY:  hom, sums_ls_l, weight_substep
[1320]473
[1239]474       IMPLICIT NONE
475
476
[1682]477       CHARACTER (LEN=*) ::  prog_var  !<
[1239]478
[1682]479       REAL(wp) ::  tmp_tend    !<
480       REAL(wp) ::  dtm         !<
481       REAL(wp) ::  dtp         !<
482       REAL(wp) ::  time        !<
[1239]483
[1682]484       INTEGER(iwp) ::  i  !<
485       INTEGER(iwp) ::  j  !<
486       INTEGER(iwp) ::  k  !<
487       INTEGER(iwp) ::  nt  !<
[1239]488
[1320]489
[1365]490       nt = 1
491       DO WHILE ( time > timenudge(nt) )
492         nt = nt+1
[1239]493       ENDDO
[1249]494       IF ( time /= timenudge(1) )  THEN
[1365]495         nt = nt-1
[1239]496       ENDIF
497
[1365]498       dtm = ( time - timenudge(nt) ) / ( timenudge(nt+1) - timenudge(nt) )
499       dtp = ( timenudge(nt+1) - time ) / ( timenudge(nt+1) - timenudge(nt) )
[1239]500
501       SELECT CASE ( prog_var )
502
503          CASE ( 'u' )
504
505             DO  k = nzb_u_inner(j,i)+1, nzt
506
[1365]507                tmp_tend = - ( hom(k,1,1,0) - ( unudge(k,nt) * dtp +           &
508                               unudge(k,nt+1) * dtm ) ) / tmp_tnudge(k)
[1239]509
[1365]510                tend(k,j,i) = tend(k,j,i) + tmp_tend
511
512                sums_ls_l(k,6) = sums_ls_l(k,6) + tmp_tend                     &
[1382]513                                 * weight_substep(intermediate_timestep_count)
[1239]514             ENDDO
515
[1382]516             sums_ls_l(nzt+1,6) = sums_ls_l(nzt,6)
517
[1239]518          CASE ( 'v' )
519
520             DO  k = nzb_u_inner(j,i)+1, nzt
521
[1365]522                tmp_tend = - ( hom(k,1,2,0) - ( vnudge(k,nt) * dtp +           &
523                               vnudge(k,nt+1) * dtm ) ) / tmp_tnudge(k)
[1239]524
[1365]525                tend(k,j,i) = tend(k,j,i) + tmp_tend
526
527                sums_ls_l(k,7) = sums_ls_l(k,7) + tmp_tend                     &
[1382]528                                 * weight_substep(intermediate_timestep_count)
[1239]529             ENDDO
530
[1382]531             sums_ls_l(nzt+1,7) = sums_ls_l(nzt,7)
[1239]532
533          CASE ( 'pt' )
534
535             DO  k = nzb_u_inner(j,i)+1, nzt
536
[1365]537                tmp_tend = - ( hom(k,1,4,0) - ( ptnudge(k,nt) * dtp +          &
538                               ptnudge(k,nt+1) * dtm ) ) / tmp_tnudge(k)
[1239]539
[1365]540                tend(k,j,i) = tend(k,j,i) + tmp_tend
541
542                sums_ls_l(k,4) = sums_ls_l(k,4) + tmp_tend                     &
[1382]543                                 * weight_substep(intermediate_timestep_count)
[1239]544             ENDDO
545
[1382]546             sums_ls_l(nzt+1,4) = sums_ls_l(nzt,4)
[1239]547
[1382]548
[1239]549          CASE ( 'q' )
550
551             DO  k = nzb_u_inner(j,i)+1, nzt
552
[1365]553                tmp_tend = - ( hom(k,1,41,0) - ( qnudge(k,nt) * dtp +          &
554                               qnudge(k,nt+1) * dtm ) ) / tmp_tnudge(k)
[1239]555
[1365]556                tend(k,j,i) = tend(k,j,i) + tmp_tend
557
558                sums_ls_l(k,5) = sums_ls_l(k,5) + tmp_tend                     &
[1382]559                                 * weight_substep(intermediate_timestep_count)
[1239]560             ENDDO
561
[1382]562             sums_ls_l(nzt+1,5) = sums_ls_l(nzt,5)
563
[1239]564          CASE DEFAULT
565             message_string = 'unknown prognostic variable "' // prog_var // '"'
566             CALL message( 'nudge', 'PA0367', 1, 2, 0, 6, 0 )
567
568       END SELECT
569
570
571    END SUBROUTINE nudge_ij
572
[1380]573
[1682]574!------------------------------------------------------------------------------!
575! Description:
576! ------------
577!> @todo Missing subroutine description.
578!------------------------------------------------------------------------------!
[1380]579    SUBROUTINE nudge_ref ( time )
580
581       USE arrays_3d,                                                          &
[1398]582           ONLY:  time_vert, ptnudge, pt_init, qnudge, q_init, unudge, u_init, &
583                  vnudge, v_init
[1380]584
585       USE kinds
586
587
588       IMPLICIT NONE
589
[1682]590       INTEGER(iwp) ::  nt                    !<
[1380]591
[1682]592       REAL(wp)             ::  fac           !<
593       REAL(wp), INTENT(in) ::  time          !<
[1380]594
595!
596!--    Interpolation in time of NUDGING_DATA for pt_init and q_init. This is
597!--    needed for correct upper boundary conditions for pt and q and in case that
598!      large scale subsidence as well as scalar Rayleigh-damping are used
599       nt = 1
600       DO WHILE ( time > time_vert(nt) )
601          nt = nt + 1
602       ENDDO
603       IF ( time /= time_vert(nt) )  THEN
604        nt = nt - 1
605       ENDIF
606
607       fac = ( time-time_vert(nt) ) / ( time_vert(nt+1)-time_vert(nt) )
608
609       pt_init = ptnudge(:,nt) + fac * ( ptnudge(:,nt+1) - ptnudge(:,nt) )
610       q_init  = qnudge(:,nt) + fac * ( qnudge(:,nt+1) - qnudge(:,nt) )
[1398]611       u_init  = unudge(:,nt) + fac * ( unudge(:,nt+1) - unudge(:,nt) )
612       v_init  = vnudge(:,nt) + fac * ( vnudge(:,nt+1) - vnudge(:,nt) )
[1380]613
614    END SUBROUTINE nudge_ref
615
[1239]616 END MODULE nudge_mod
Note: See TracBrowser for help on using the repository browser.