← Back to Documentation Home
CCPP SciDoc v8.0.0  v8.0.0
Common Community Physics Package Developed at DTC
 
Loading...
Searching...
No Matches
gwdps.f
1
4
7 module gwdps
8
9 contains
10
194 subroutine gwdps_run( &
195 & IM,KM,A,B,C,ten_q,U1,V1,T1,Q1,KPBL, &
196 & PRSI,DEL,PRSL,PRSLK,PHII, PHIL,DELTIM,KDT, &
197 & HPRIME,OC,OA4,CLX4,THETA,SIGMA,GAMMA,ELVMAX, &
198 & DUSFC,DVSFC,dtaux2d_ms,dtauy2d_ms,dtaux2d_bl, &
199 & dtauy2d_bl,dusfc_ms,dvsfc_ms,dusfc_bl,dvsfc_bl, &
200 & G, CP, RD, RV, IMX, &
201 & nmtvr, cdmbgwd, me, lprnt, ipr, rdxzb, ldiag_ugwp, &
202 & errmsg, errflg)
203
204!
205! ********************************************************************
206! -----> I M P L E M E N T A T I O N V E R S I O N <----------
207!
208! --- Not in this code -- History of GWDP at NCEP----
209! ---------------- -----------------------
210! VERSION 3 MODIFIED FOR GRAVITY WAVES, LOCATION: .FR30(V3GWD) *J*
211!--- 3.1 INCLUDES VARIABLE SATURATION FLUX PROFILE CF ISIGST
212!--- 3.G INCLUDES PS COMBINED W/ PH (GLAS AND GFDL)
213!----- ALSO INCLUDED IS RI SMOOTH OVER A THICK LOWER LAYER
214!----- ALSO INCLUDED IS DECREASE IN DE-ACC AT TOP BY 1/2
215!----- THE NMC GWD INCORPORATING BOTH GLAS(P&S) AND GFDL(MIGWD)
216!----- MOUNTAIN INDUCED GRAVITY WAVE DRAG
217!----- CODE FROM .FR30(V3MONNX) FOR MONIN3
218!----- THIS VERSION (06 MAR 1987)
219!----- THIS VERSION (26 APR 1987) 3.G
220!----- THIS VERSION (01 MAY 1987) 3.9
221!----- CHANGE TO FORTRAN 77 (FEB 1989) --- HANN-MING HENRY JUANG
222!----- 20070601 ELVMAX bug fix (*j*)
223!
224! VERSION 4
225! ----- This code -----
226!
227!----- MODIFIED TO IMPLEMENT THE ENHANCED LOW TROPOSPHERIC GRAVITY
228!----- WAVE DRAG DEVELOPED BY KIM AND ARAKAWA(JAS, 1995).
229! Orographic Std Dev (hprime), Convexity (OC), Asymmetry (OA4)
230! and Lx (CLX4) are input topographic statistics needed.
231!
232!----- PROGRAMMED AND DEBUGGED BY HONG, ALPERT AND KIM --- JAN 1996.
233!----- debugged again - moorthi and iredell --- may 1998.
234!-----
235! Further Cleanup, optimization and modification
236! - S. Moorthi May 98, March 99.
237!----- modified for usgs orography data (ncep office note 424)
238! and with several bugs fixed - moorthi and hong --- july 1999.
239!
240!----- Modified & implemented into NRL NOGAPS
241! - Young-Joon Kim, July 2000
242!-----
243! VERSION lm MB (6): oz fix 8/2003
244! ----- This code -----
245!
246!------ Changed to include the Lott and Miller Mtn Blocking
247! with some modifications by (*j*) 4/02
248! From a Principal Coordinate calculation using the
249! Hi Res 8 minute orography, the Angle of the
250! mtn with that to the East (x) axis is THETA, the slope
251! parameter SIGMA. The anisotropy is in GAMMA - all are input
252! topographic statistics needed. These are calculated off-line
253! as a function of model resolution in the fortran code ml01rg2.f,
254! with script mlb2.sh. (*j*)
255!----- gwdps_mb.f version (following lmi) elvmax < hncrit (*j*)
256! MB3a expt to enhance elvmax mtn hgt see sigfac & hncrit
257! gwdps_GWDFIX_v6.f FIXGWD GF6.0 20070608 sigfac=4.
258!-----
259!----------------------------------------------------------------------C
260! USE
261! ROUTINE IS CALLED FROM GBPHYS (AFTER CALL TO MONNIN)
262!
263! PURPOSE
264! USING THE GWD PARAMETERIZATIONS OF PS-GLAS AND PH-
265! GFDL TECHNIQUE. THE TIME TENDENCIES OF U V
266! ARE ALTERED TO INCLUDE THE EFFECT OF MOUNTAIN INDUCED
267! GRAVITY WAVE DRAG FROM SUB-GRID SCALE OROGRAPHY INCLUDING
268! CONVECTIVE BREAKING, SHEAR BREAKING AND THE PRESENCE OF
269! CRITICAL LEVELS
270!
271! INPUT
272! A(IM,KM) NON-LIN TENDENCY FOR V WIND COMPONENT
273! B(IM,KM) NON-LIN TENDENCY FOR U WIND COMPONENT
274! C(IM,KM) NON-LIN TENDENCY FOR TEMPERATURE
275! U1(IM,KM) ZONAL WIND M/SEC AT T0-DT
276! V1(IM,KM) MERIDIONAL WIND M/SEC AT T0-DT
277! T1(IM,KM) TEMPERATURE DEG K AT T0-DT
278! Q1(IM,KM) SPECIFIC HUMIDITY AT T0-DT
279!
280! DELTIM TIME STEP SECS
281! SI(N) P/PSFC AT BASE OF LAYER N
282! SL(N) P/PSFC AT MIDDLE OF LAYER N
283! DEL(N) POSITIVE INCREMENT OF P/PSFC ACROSS LAYER N
284! KPBL(IM) is the index of the top layer of the PBL
285! ipr & lprnt for diagnostics
286!
287! OUTPUT
288! A, B AS AUGMENTED BY TENDENCY DUE TO GWDPS
289! OTHER INPUT VARIABLES UNMODIFIED.
290! revision log:
291! May 2013 J. Wang change cleff back to opn setting
292! Jan 2014 J. Wang merge Henry and Fangin's dissipation heat in gfs to nems
293!
294!
295! ********************************************************************
296 USE machine , ONLY : kind_phys
297 implicit none
298!
299 ! Interface variables
300 integer, intent(in) :: im, km, imx, kdt, ipr, me
301 integer, intent(in) :: KPBL(:) ! Index for the PBL top layer!
302 real(kind=kind_phys), intent(in) :: &
303 & deltim, g, cp, rd, rv, cdmbgwd(:)
304 real(kind=kind_phys), intent(out) :: &
305 & a(:,:), b(:,:), c(:,:)
306 real(kind=kind_phys), intent(out) :: ten_q(:,:,:)
307 real(kind=kind_phys), intent(in) :: &
308 & u1(:,:), v1(:,:), t1(:,:), &
309 & q1(:,:), prsi(:,:), del(:,:), &
310 & prsl(:,:), prslk(:,:), phil(:,:), &
311 & phii(:,:)
312 real(kind=kind_phys), intent(in) :: &
313 & oc(:), oa4(:,:), clx4(:,:), hprime(:)
314 real(kind=kind_phys), intent(inout) :: elvmax(:)
315 real(kind=kind_phys), intent(in) :: &
316 & theta(:), sigma(:), gamma(:)
317 real(kind=kind_phys), intent(inout) :: dusfc(:), dvsfc(:), &
318 & rdxzb(:)
319 real(kind=kind_phys), intent(inout), optional :: dtaux2d_ms(:,:), &
320 & dtauy2d_ms(:,:), dtaux2d_bl(:,:), &
321 & dtauy2d_bl(:,:)
322 real(kind=kind_phys), intent(inout), optional :: dusfc_ms(:), &
323 & dvsfc_ms(:), dusfc_bl(:), dvsfc_bl(:)
324 integer, intent(in) :: nmtvr
325 logical, intent(in) :: lprnt
326 logical, intent(in) :: ldiag_ugwp
327 character(len=*), intent(out) :: errmsg
328 integer, intent(out) :: errflg
329!
330 ! Local variables
331! for lm mtn blocking
332 real(kind=kind_phys) wk(im)
333 real(kind=kind_phys) bnv2lm(im,km),pe(im),ek(im),zbk(im),up(im)
334 real(kind=kind_phys) db(im,km),ang(im,km),uds(im,km)
335 real(kind=kind_phys) zlen, rtrm, phiang, cdmb, dbim, zr, cdmbo4
336 real(kind=kind_phys) eng0, eng1
337!
338! Some constants
339!
340 real(kind=kind_phys) pi, dw2min, rimin, ric, bnv2min, efmin
341 &, efmax,hpmax,hpmin, rad_to_deg, deg_to_rad
342 parameter(pi=3.1415926535897931)
343 parameter(rad_to_deg=180.0/pi, deg_to_rad=pi/180.0)
344 parameter(dw2min=1., rimin=-100., ric=0.25, bnv2min=1.0e-5)
345! PARAMETER (EFMIN=0.0, EFMAX=10.0, hpmax=200.0)
346 parameter(efmin=0.0, efmax=10.0, hpmax=2400.0, hpmin=1.0)
347!
348 real(kind=kind_phys) frc, ce, ceofrc, frmax, cg, gmax
349 &, veleps, factop, rlolev, rdi
350! &, CRITAC, VELEPS, FACTOP, RLOLEV, RDI
351 parameter(frc=1.0, ce=0.8, ceofrc=ce/frc, frmax=100., cg=0.5)
352 parameter(gmax=1.0, veleps=1.0, factop=0.5)
353! parameter (GMAX=1.0, CRITAC=5.0E-4, VELEPS=1.0, FACTOP=0.5)
354 parameter(rlolev=50000.0)
355! parameter (RLOLEV=500.0)
356! parameter (RLOLEV=0.5)
357!
358 real(kind=kind_phys) dpmin,hminmt,hncrit,minwnd,sigfac
359! --- for lm mtn blocking
360! parameter (cdmb = 1.0) !< non-dim sub grid mtn drag Amp (*j*)
361 parameter(hncrit=8000.)
362! hncrit set to 8000m and sigfac added to enhance elvmax mtn hgt
363
364 parameter(sigfac=4.0)
365 parameter(hminmt=50.)
366 parameter(minwnd=0.1)
367
368! parameter (dpmin=00.0) !< Minimum thickness of the reference layer
369!! parameter (dpmin=05.0) !< Minimum thickness of the reference layer
370! parameter (dpmin=20.0) !< Minimum thickness of the reference layer
371
372 parameter(dpmin=5000.0)
374!
375 real(kind=kind_phys) fdir
376 integer mdir
377 parameter(mdir=8, fdir=mdir/(pi+pi))
378 integer nwdir(mdir)
379 data nwdir/6,7,5,8,2,3,1,4/
380 save nwdir
381!
382 LOGICAL ICRILV(IM)
383!
384!---- MOUNTAIN INDUCED GRAVITY WAVE DRAG
385!
386 real(kind=kind_phys) taub(im), xn(im), yn(im), ubar(im) &
387 &, vbar(im), ulow(im), oa(im), clx(im) &
388 &, roll(im), uloi(im) &
389 &, dtfac(im), xlinv(im), delks(im)
390! &, DTFAC(IM), XLINV(IM), DELKS(IM), DELKS1(IM)
391!
392 real(kind=kind_phys) bnv2(im,km), taup(im,km+1), ri_n(im,km) &
393 &, taud(im,km), ro(im,km), vtk(im,km) &
394 &, vtj(im,km), scor(im), velco(im,km-1) &
395 &, bnv2bar(im), cdsigohp(im)
396!
397! real(kind=kind_phys) VELKO(KM-1)
398 integer kref(IM), kint(im), iwk(im), ipt(im)
399! for lm mtn blocking
400 integer iwklm(im)
401! integer kreflm(IM), iwklm(im)
402 integer idxzb(im), ktrial, klevm1
403!
404 real(kind=kind_phys) gor, gocp, fv, gr2, bnv, fr &
405 &, brvf, cleff, tem, tem1, tem2, temc, temv&
406 &, wdir, ti, rdz, dw2, shr2, bvf2 &
407 &, rdelks, efact, coefm, gfobnv, onebg &
408 &, scork, rscor, hd, fro, rim, sira &
409 &, dtaux, dtauy, pkp1log, pklog &
410 &, cosang, sinang, cos2a, sin2a, oneocpdt
411!
412 integer kmm1, kmm2, lcap, lcapp1, kbps, kbpsp1,kbpsm1 &
413 &, kmps, idir, nwd, i, j, k, klcap, kp1, kmpbl, npt, npr, kmll
414! &, kmll,kmds,ihit,jhit
415!
416 ! Initialize CCPP error handling variables
417 errmsg = ''
418 errflg = 0
419
420 a = 0.0
421 b = 0.0
422 c = 0.0
423 ten_q = 0.0
424!
425! parameter (cdmb = 1.0) ! non-dim sub grid mtn drag Amp (*j*)
426! non-dim sub grid mtn drag Amp (*j*)
427! cdmb = 1.0/float(IMX/192)
428! cdmb = 192.0/float(IMX)
429 cdmb = 4.0 * 192.0/float(imx)
430 if (cdmbgwd(1) >= 0.0) cdmb = cdmb * cdmbgwd(1)
431 cdmbo4 = 0.25 * cdmb
432!
433 npr = 0
434!
435 DO k = 1, km
436 DO i = 1, im
437 db(i,k) = 0.
438 ang(i,k) = 0.
439 uds(i,k) = 0.
440 ENDDO
441 ENDDO
442!
443 rdi = 1.0 / rd
444 onebg = 1.0 / g
445 gor = g/rd
446 gr2 = g*gor
447 gocp = g/cp
448 fv = rv/rd - 1
449 oneocpdt = 1.0 / (cp*deltim)
450!
451! NCNT = 0
452 kmm1 = km - 1
453 kmm2 = km - 2
454 lcap = km
455 lcapp1 = lcap + 1
456!
457 rdxzb(:) = 0
458!
459 IF ( nmtvr == 14) then
460! ---- for lm and gwd calculation points
461 ipt = 0
462 npt = 0
463 DO i = 1,im
464 IF (elvmax(i) > hminmt .and. hprime(i) > hpmin) then
465 npt = npt + 1
466 ipt(npt) = i
467! if (lprnt .and. ipr == i) npr = npt
468 ENDIF
469 ENDDO
470 IF (npt == 0) RETURN ! No gwd/mb calculation done!
471!
472! if (lprnt) print *,' npt=',npt,' npr=',npr,' ipr=',ipr,' im=',im
473! &,' ipt(npt)=',ipt(npt)
474!
475! --- iwklm is the level above the height of the of the mountain.
476! --- idxzb is the level of the dividing streamline.
477! INITIALIZE DIVIDING STREAMLINE (DS) CONTROL VECTOR
478!
479 do i=1,npt
480 iwklm(i) = 2
481 idxzb(i) = 0
482! kreflm(i) = 0
483 enddo
484! if (lprnt)
485! & print *,' in gwdps_lm.f npt,IM,IY,km,me=',npt,IM,IY,km,me
486!
487!
489!
490!..............................
491!..............................
492!
493! (*j*) 11/03: test upper limit on KMLL=km - 1
494! then do not need hncrit -- test with large hncrit first.
495! KMLL = km / 2 ! maximum mtnlm height : # of vertical levels / 2
496
497 kmll = kmm1
498
499! --- No mtn should be as high as KMLL (so we do not have to start at
500! --- the top of the model but could do calc for all levels).
501!
502 DO i = 1, npt
503 j = ipt(i)
504 elvmax(j) = min(elvmax(j) + sigfac * hprime(j), hncrit)
505 cdsigohp(i) = cdmbo4 * sigma(j) / hprime(j)
506 ENDDO
507!
508 DO k = 1,kmll
509 DO i = 1, npt
510 j = ipt(i)
511! --- interpolate to max mtn height for index, iwklm(I) wk[gz]
512! --- ELVMAX is limited to hncrit because to hi res topo30 orog.
513 pkp1log = phil(j,k+1) * onebg
514 pklog = phil(j,k) * onebg
515!!!------- ELVMAX(J) = min (ELVMAX(J) + sigfac * hprime(j), hncrit)
516
517 if (elvmax(j) <= pkp1log .and. elvmax(j) >= pklog) THEN
518
519! print *,' in gwdps_lm.f 1 =',k,ELVMAX(j),pklog,pkp1log,me
520! --- wk for diags but can be saved and reused.
521 wk(i) = g * elvmax(j) / (phil(j,k+1) - phil(j,k))
522 iwklm(i) = max(iwklm(i), k+1)
523! print *,' in gwdps_lm.f 2 npt=',npt,i,j,wk(i),iwklm(i),me
524 endif
525!
526! --- find at prsl levels large scale environment variables
527! --- these cover all possible mtn max heights
528 vtj(i,k) = t1(j,k) * (1.0+fv*q1(j,k))
529 vtk(i,k) = vtj(i,k) / prslk(j,k)
530 ro(i,k) = rdi * prsl(j,k) / vtj(i,k) ! DENSITY Kg/M**3
531 ENDDO
532 ENDDO
533!
534! testing for highest model level of mountain top
535!
536! ihit = 2
537! jhit = 0
538! do i = 1, npt
539! j=ipt(i)
540! if ( iwklm(i) .gt. ihit ) then
541! ihit = iwklm(i)
542! jhit = j
543! endif
544! enddo
545! print *, ' mb: kdt,max(iwklm),jhit,phil,me=',
546! & kdt,ihit,jhit,phil(jhit,ihit),me
547
548 klevm1 = kmll - 1
549 DO k = 1, klevm1
550 kp1 = k + 1
551 DO i = 1, npt
552 j = ipt(i)
553 rdz = g / (phil(j,kp1) - phil(j,k))
554! --- Brunt-Vaisala Frequency
556 bnv2lm(i,k) = (g+g) * rdz * (vtk(i,kp1) - vtk(i,k))
557 & / (vtk(i,kp1) + vtk(i,k))
558 bnv2lm(i,k) = max( bnv2lm(i,k), bnv2min )
559 ENDDO
560 ENDDO
561! print *,' in gwdps_lm.f 3 npt=',npt,j,RDZ,me
562!
563 DO i = 1, npt
564 j = ipt(i)
565 delks(i) = 1.0 / (prsi(j,1) - prsi(j,iwklm(i)))
566! DELKS1(I) = 1.0 / (PRSI(J,1) - PRSL(J,iwklm(i)))
567 ubar(i) = 0.0
568 vbar(i) = 0.0
569 roll(i) = 0.0
570 pe(i) = 0.0
571 ek(i) = 0.0
572 bnv2bar(i) = (prsi(j,1)-prsl(j,1)) * delks(i) * bnv2lm(i,1)
573 ENDDO
574
575! --- find the dividing stream line height
576! --- starting from the level above the max mtn downward
577! --- iwklm(i) is the k-index of mtn elvmax elevation
580! DO Ktrial = KMLL, 1, -1
581! DO I = 1, npt
582! IF ( Ktrial < iwklm(I) .and. kreflm(I) == 0 ) then
583! kreflm(I) = Ktrial
584! ENDIF
585! ENDDO
586! ENDDO
587! print *,' in gwdps_lm.f 4 npt=',npt,kreflm(npt),me
588!
589! --- in the layer kreflm(I) to 1 find PE (which needs N, ELVMAX)
590! --- make averages, guess dividing stream (DS) line layer.
591! --- This is not used in the first cut except for testing and
592! --- is the vert ave of quantities from the surface to mtn top.
593!
594 DO i = 1, npt
595 DO k = 1, iwklm(i)-1
596 j = ipt(i)
597 rdelks = del(j,k) * delks(i)
598 ubar(i) = ubar(i) + rdelks * u1(j,k) ! trial Mean U below
599 vbar(i) = vbar(i) + rdelks * v1(j,k) ! trial Mean V below
600 roll(i) = roll(i) + rdelks * ro(i,k) ! trial Mean RO below
601 if (k < iwklm(i)-1) then
602 rdelks = (prsl(j,k)-prsl(j,k+1)) * delks(i)
603 else
604 rdelks = (prsl(j,k)-prsi(j,k+1)) * delks(i)
605 endif
606 bnv2bar(i) = bnv2bar(i) + bnv2lm(i,k) * rdelks
607! --- these vert ave are for diags, testing and GWD to follow (*j*).
608 ENDDO
609 ENDDO
610! print *,' in gwdps_lm.f 5 =',i,kreflm(npt),BNV2bar(npt),me
611!
612! --- integrate to get PE in the trial layer.
613! --- Need the first layer where PE>EK - as soon as
614! --- IDXZB is not 0 we have a hit and Zb is found.
615!
616 DO i = 1, npt
617 j = ipt(i)
618 DO k = iwklm(i), 1, -1
619 phiang = atan2(v1(j,k),u1(j,k))*rad_to_deg
620 ang(i,k) = ( theta(j) - phiang )
621 if ( ang(i,k) > 90. ) ang(i,k) = ang(i,k) - 180.
622 if ( ang(i,k) < -90. ) ang(i,k) = ang(i,k) + 180.
623 ang(i,k) = ang(i,k) * deg_to_rad
624!
631
632 uds(i,k) =
633 & max(sqrt(u1(j,k)*u1(j,k) + v1(j,k)*v1(j,k)), minwnd)
634! --- Test to see if we found Zb previously
635 IF (idxzb(i) == 0 ) then
636 pe(i) = pe(i) + bnv2lm(i,k) * (g*elvmax(j) - phil(j,k))
637 & * (phii(j,k+1) - phii(j,k))
638 & * (onebg*onebg)
639! --- KE
640! --- Wind projected on the line perpendicular to mtn range, U(Zb(K)).
641! --- kenetic energy is at the layer Zb
642! --- THETA ranges from -+90deg |_ to the mtn "largest topo variations"
643 up(i) = uds(i,k) * cos(ang(i,k))
644 ek(i) = 0.5 * up(i) * up(i)
645
646! --- Dividing Stream lime is found when PE =exceeds EK.
647 IF (pe(i) >= ek(i)) THEN
648 idxzb(i) = k
649 rdxzb(j) = real(k,kind=kind_phys)
650 ENDIF
651! --- Then mtn blocked flow is between Zb=k(IDXZB(I)) and surface
652!
666 ENDIF
667 ENDDO
668 ENDDO
669!
670! print *,' in gwdps_lm.f 6 =',phiang,THETA(ipt(npt)),me
671! print *,' in gwdps_lm.f 7 =',IDXZB(npt),PE(npt)
672!
673! if (lprnt .and. npr .gt. 0) then
674! print *,' BNV2bar,BNV2lm=',bnv2bar(npr),BNV2lm(npr,1:klevm1)
675! print *,' npr,IDXZB,UDS=',npr,IDXZB(npr),UDS(npr,:)
676! print *,' PE,UP,EK=',PE(npr),UP(npr),EK(npr)
677! endif
678!
679 DO i = 1, npt
680 j = ipt(i)
681! --- Calc if N constant in layers (Zb guess) - a diagnostic only.
682 zbk(i) = elvmax(j)
683 & - sqrt(ubar(i)*ubar(i) + vbar(i)*vbar(i))/bnv2bar(i)
684 ENDDO
685!
686! if (lprnt .and. npr .gt. 0) then
687! print *,' iwklm,ZBK=',iwklm(npr),ZBK(npr),IDXZB(npr)
688! print *,' Zb=',PHIL(ipr),IDXZB(npr))/G
689! print *,' in gwdps_lm.f 8 npt =',npt,ZBK(npt),UP(npt),me
690! endif
691!
692! --- The drag for mtn blocked flow
693!
694 DO i = 1, npt
695 j = ipt(i)
696 zlen = 0.
697! print *,' in gwdps_lm.f 9 =',i,j,IDXZB(i),me
698 IF (idxzb(i) > 0) then
699 DO k = idxzb(i), 1, -1
700 IF (phil(j,idxzb(i)) > phil(j,k)) then
701
709 zlen = sqrt( (phil(j,idxzb(i)) - phil(j,k))
710 & / (phil(j,k ) + g*hprime(j)) )
711! --- lm eq 14:
721
722 cosang = cos(ang(i,k))
723 sinang = sin(ang(i,k))
724 cos2a = cosang * cosang
725 sin2a = sinang * sinang
726 tem = cos2a + gamma(j)*sin2a
727 ! Here Rtrm is 1.0/R
728 ! --------------------
729 if (abs(tem) > 1.e-06) then
730 rtrm = (gamma(j)*cos2a + sin2a) / tem
731 elseif (tem > 0.0) then
732 rtrm = (gamma(j)*cos2a + sin2a) * 1.0e6
733 else
734 rtrm = - (gamma(j)*cos2a + sin2a) * 1.0e6
735 endif
736 zr = max( 2.0 - rtrm, 0. )
737
738! --- (negitive of DB -- see sign at tendency)
748
749 db(i,k) = cdsigohp(i) * zr * ro(i,k) * zlen
750 & * max(cosang, gamma(j)*sinang) * uds(i,k)
751!
752! if(lprnt .and. i .eq. npr) then
753! print *,' in gwdps_lmi.f 10 npt=',npt,i,j,idxzb(i)
754! &, DBTMP,R' ang=',ang(i,k),' gamma=',gamma(j),' K=',K
755! print *,' in gwdps_lmi.f 11 K=',k,ZLEN,cos(ANG(I,K))
756! print *,' in gwdps_lmi.f 12 DB=',DB(i,k),sin(ANG(I,K))
757! endif
758 endif
759 ENDDO
760! if(lprnt) print *,' @K=1,ZLEN,DBTMP=',K,ZLEN,DBTMP
761 endif
762 ENDDO
763!
764!.............................
765!.............................
766! end mtn blocking section
767!
768 ELSEIF ( nmtvr /= 14) then
769! ---- for mb not present and gwd (nmtvr .ne .14)
770 ipt = 0
771 npt = 0
772 DO i = 1,im
773 IF ( hprime(i) > hpmin ) then
774 npt = npt + 1
775 ipt(npt) = i
776 if (ipr == i) npr = npt
777 ENDIF
778 ENDDO
779 IF (npt == 0) RETURN ! No gwd/mb calculation done!
780!
781! if (lprnt) print *,' NPR=',npr,' npt=',npt,' IPR=',IPR
782! &,' ipt(npt)=',ipt(npt)
783!
784 do i=1,npt
785 idxzb(i) = 0
786 enddo
787 ENDIF
788!
789!.............................
790!.............................
791!
793 kmpbl = km / 2 ! maximum pbl height : # of vertical levels / 2
794!
795! Scale cleff between IM=384*2 and 192*2 for T126/T170 and T62
796!
797 if (imx > 0) then
798! cleff = 1.0E-5 * SQRT(FLOAT(IMX)/384.0) ! this is inverse of CLEFF!
799! cleff = 1.0E-5 * SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF!
800! cleff = 0.5E-5 * SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF!
801! cleff = 1.0E-5 * SQRT(FLOAT(IMX)/192)/float(IMX/192)
802! cleff = 1.0E-5 / SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF!
803 cleff = 0.5e-5 / sqrt(float(imx)/192.0) ! this is inverse of CLEFF!
804! hmhj for ndsl
805! jw cleff = 0.1E-5 / SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF!
806! cleff = 2.0E-5 * SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF!
807! cleff = 2.5E-5 * SQRT(FLOAT(IMX)/192.0) ! this is inverse of CLEFF!
808 endif
809 if (cdmbgwd(2) >= 0.0) cleff = cleff * cdmbgwd(2)
810!
811 DO k = 1,km
812 DO i =1,npt
813 j = ipt(i)
814 vtj(i,k) = t1(j,k) * (1.0+fv*q1(j,k))
815 vtk(i,k) = vtj(i,k) / prslk(j,k)
816 ro(i,k) = rdi * prsl(j,k) / vtj(i,k) ! DENSITY TONS/M**3
817 taup(i,k) = 0.0
818 ENDDO
819 ENDDO
820 DO k = 1,kmm1
821 kp1 = k + 1
822 DO i =1,npt
823 j = ipt(i)
824 ti = 2.0 / (t1(j,k)+t1(j,kp1))
825 tem = ti / (prsl(j,k)-prsl(j,kp1))
826 rdz = g / (phil(j,kp1) - phil(j,k))
827 tem1 = u1(j,k) - u1(j,kp1)
828 tem2 = v1(j,k) - v1(j,kp1)
829 dw2 = tem1*tem1 + tem2*tem2
830 shr2 = max(dw2,dw2min) * rdz * rdz
831 bvf2 = g*(gocp+rdz*(vtj(i,kp1)-vtj(i,k))) * ti
832 ri_n(i,k) = max(bvf2/shr2,rimin) ! Richardson number
833! Brunt-Vaisala Frequency
834! TEM = GR2 * (PRSL(J,K)+PRSL(J,K+1)) * TEM
835! BNV2(I,K) = TEM * (VTK(I,K+1)-VTK(I,K))/(VTK(I,K+1)+VTK(I,K))
836 bnv2(i,k) = (g+g) * rdz * (vtk(i,kp1)-vtk(i,k))
837 & / (vtk(i,kp1)+vtk(i,k))
838 bnv2(i,k) = max( bnv2(i,k), bnv2min )
839 ENDDO
840 ENDDO
841! print *,' in gwdps_lm.f GWD:14 =',npt,kmm1,bnv2(npt,kmm1)
842!
843! Apply 3 point smoothing on BNV2
844!
845! do k=1,km
846! do i=1,im
847! vtk(i,k) = bnv2(i,k)
848! enddo
849! enddo
850! do k=2,kmm1
851! do i=1,im
852! bnv2(i,k) = 0.25*(vtk(i,k-1)+vtk(i,k+1)) + 0.5*vtk(i,k)
853! enddo
854! enddo
855!
856! Finding the first interface index above 50 hPa level
857!
858 do i=1,npt
859 iwk(i) = 2
860 enddo
861 DO k=3,kmpbl
862 DO i=1,npt
863 j = ipt(i)
864 tem = (prsi(j,1) - prsi(j,k))
865 if (tem < dpmin) iwk(i) = k
866 enddo
867 enddo
868!
871 kbps = 1
872 kmps = km
873 DO i=1,npt
874 j = ipt(i)
875 kref(i) = max(iwk(i), kpbl(j)+1 ) ! reference level
876 delks(i) = 1.0 / (prsi(j,1) - prsi(j,kref(i)))
877! DELKS1(I) = 1.0 / (PRSI(J,1) - PRSL(J,kref(I)))
878 ubar(i) = 0.0
879 vbar(i) = 0.0
880 roll(i) = 0.0
881 kbps = max(kbps, kref(i))
882 kmps = min(kmps, kref(i))
883!
884 bnv2bar(i) = (prsi(j,1)-prsl(j,1)) * delks(i) * bnv2(i,1)
885 ENDDO
886! print *,' in gwdps_lm.f GWD:15 =',KBPS,KMPS
887 kbpsp1 = kbps + 1
888 kbpsm1 = kbps - 1
889 DO k = 1,kbps
890 DO i = 1,npt
891 IF (k < kref(i)) THEN
892 j = ipt(i)
893 rdelks = del(j,k) * delks(i)
894 ubar(i) = ubar(i) + rdelks * u1(j,k) ! Mean U below kref
895 vbar(i) = vbar(i) + rdelks * v1(j,k) ! Mean V below kref
896!
897 roll(i) = roll(i) + rdelks * ro(i,k) ! Mean RO below kref
898 if (k < kref(i)-1) then
899 rdelks = (prsl(j,k)-prsl(j,k+1)) * delks(i)
900 else
901 rdelks = (prsl(j,k)-prsi(j,k+1)) * delks(i)
902 endif
903 bnv2bar(i) = bnv2bar(i) + bnv2(i,k) * rdelks
904 ENDIF
905 ENDDO
906 ENDDO
907! print *,' in gwdps_lm.f GWD:15B =',bnv2bar(npt)
908!
909! FIGURE OUT LOW-LEVEL HORIZONTAL WIND DIRECTION AND FIND 'OA'
910!
911! NWD 1 2 3 4 5 6 7 8
912! WD W S SW NW E N NE SE
913!
916 DO i = 1,npt
917 j = ipt(i)
918 wdir = atan2(ubar(i),vbar(i)) + pi
919 idir = mod(nint(fdir*wdir),mdir) + 1
920 nwd = nwdir(idir)
921 oa(i) = (1-2*int( (nwd-1)/4 )) * oa4(j,mod(nwd-1,4)+1)
922 clx(i) = clx4(j,mod(nwd-1,4)+1)
923 ENDDO
924!
925!-----XN,YN "LOW-LEVEL" WIND PROJECTIONS IN ZONAL
926! & MERIDIONAL DIRECTIONS
927!-----ULOW "LOW-LEVEL" WIND MAGNITUDE - (= U)
928!-----BNV2 BNV2 = N**2
929!-----TAUB BASE MOMENTUM FLUX
930!-----= -(RO * U**3/(N*XL)*GF(FR) FOR N**2 > 0
931!-----= 0. FOR N**2 < 0
932!-----FR FROUDE = N*HPRIME / U
933!-----G GMAX*FR**2/(FR**2+CG/OC)
934!
935!-----INITIALIZE SOME ARRAYS
936!
937 DO i = 1,npt
938 xn(i) = 0.0
939 yn(i) = 0.0
940 taub(i) = 0.0
941 ulow(i) = 0.0
942 dtfac(i) = 1.0
943 icrilv(i) = .false. ! INITIALIZE CRITICAL LEVEL CONTROL VECTOR
944
945!
946!----COMPUTE THE "LOW LEVEL" WIND MAGNITUDE (M/S)
947!
948 ulow(i) = max(sqrt(ubar(i)*ubar(i) + vbar(i)*vbar(i)), 1.0)
949 uloi(i) = 1.0 / ulow(i)
950 ENDDO
951!
952 DO k = 1,kmm1
953 kp1 = k + 1
954 DO i = 1,npt
955 j = ipt(i)
956 velco(i,k) = 0.5 * ((u1(j,k)+u1(j,kp1))*ubar(i)
957 & + (v1(j,k)+v1(j,kp1))*vbar(i))
958 velco(i,k) = velco(i,k) * uloi(i)
959! IF ((VELCO(I,K).LT.VELEPS) .AND. (VELCO(I,K).GT.0.)) THEN
960! VELCO(I,K) = VELEPS
961! ENDIF
962 ENDDO
963 ENDDO
964!
965!
966! find the interface level of the projected wind where
967! low levels & upper levels meet above pbl
968!
969! do i=1,npt
970! kint(i) = km
971! enddo
972! do k = 1,kmm1
973! do i = 1,npt
974! IF (K .GT. kref(I)) THEN
975! if(velco(i,k) .lt. veleps .and. kint(i) .eq. km) then
976! kint(i) = k+1
977! endif
978! endif
979! enddo
980! enddo
981! WARNING KINT = KREF !!!!!!!!!
982 do i=1,npt
983 kint(i) = kref(i)
984 enddo
985!
986! if(lprnt) print *,' ubar=',ubar
987! &,' vbar=',vbar,' ulow=',ulow,' veleps=',veleps
988!
989 DO i = 1,npt
990 j = ipt(i)
991 bnv = sqrt( bnv2bar(i) )
992 fr = bnv * uloi(i) * min(hprime(j),hpmax)
993 fr = min(fr, frmax)
994 xn(i) = ubar(i) * uloi(i)
995 yn(i) = vbar(i) * uloi(i)
996!
997! Compute the base level stress and store it in TAUB
998! CALCULATE ENHANCEMENT FACTOR, NUMBER OF MOUNTAINS & ASPECT
999! RATIO CONST. USE SIMPLIFIED RELATIONSHIP BETWEEN STANDARD
1000! DEVIATION & CRITICAL HGT
1001!
1030
1039
1040 efact = (oa(i) + 2.) ** (ceofrc*fr)
1041 efact = min( max(efact,efmin), efmax )
1042!
1043 coefm = (1. + clx(i)) ** (oa(i)+1.)
1044!
1045 xlinv(i) = coefm * cleff
1046!
1047 tem = fr * fr * oc(j)
1048 gfobnv = gmax * tem / ((tem + cg)*bnv) ! G/N0
1049!
1050 taub(i) = xlinv(i) * roll(i) * ulow(i) * ulow(i)
1051 & * ulow(i) * gfobnv * efact ! BASE FLUX Tau0
1052!
1053! tem = min(HPRIME(I),hpmax)
1054! TAUB(I) = XLINV(I) * ROLL(I) * ULOW(I) * BNV * tem * tem
1055!
1056 k = max(1, kref(i)-1)
1057 tem = max(velco(i,k)*velco(i,k), 0.1)
1058 scor(i) = bnv2(i,k) / tem ! Scorer parameter below ref level
1059 ENDDO
1060! if(lprnt) print *,' taub=',taub
1061!
1062!----SET UP BOTTOM VALUES OF STRESS
1063!
1064 DO k = 1, kbps
1065 DO i = 1,npt
1066 IF (k <= kref(i)) taup(i,k) = taub(i)
1067 ENDDO
1068 ENDDO
1069!
1070! Now compute vertical structure of the stress.
1071!
1072 DO k = kmps, kmm1 ! Vertical Level K Loop!
1073 kp1 = k + 1
1074 DO i = 1, npt
1075!
1076!-----UNSTABLE LAYER IF RI < RIC
1077!-----UNSTABLE LAYER IF UPPER AIR VEL COMP ALONG SURF VEL <=0 (CRIT LAY)
1078!---- AT (U-C)=0. CRIT LAYER EXISTS AND BIT VECTOR SHOULD BE SET (.LE.)
1079!
1080 IF (k >= kref(i)) THEN
1081 icrilv(i) = icrilv(i) .OR. ( ri_n(i,k) < ric)
1082 & .OR. (velco(i,k) <= 0.0)
1083 ENDIF
1084 ENDDO
1085!
1098 DO i = 1,npt
1099 IF (k >= kref(i)) THEN
1100 IF (.NOT.icrilv(i) .AND. taup(i,k) > 0.0 ) THEN
1101 temv = 1.0 / max(velco(i,k), 0.01)
1102! IF (OA(I) .GT. 0. .AND. PRSI(ipt(i),KP1).GT.RLOLEV) THEN
1103 IF (oa(i) > 0. .AND. kp1 < kint(i)) THEN
1104 scork = bnv2(i,k) * temv * temv
1105 rscor = min(1.0, scork / scor(i))
1106 scor(i) = scork
1107 ELSE
1108 rscor = 1.
1109 ENDIF
1110!
1122
1123 brvf = sqrt(bnv2(i,k)) ! Brunt-Vaisala Frequency
1124! TEM1 = XLINV(I)*(RO(I,KP1)+RO(I,K))*BRVF*VELCO(I,K)*0.5
1125 tem1 = xlinv(i)*(ro(i,kp1)+ro(i,k))*brvf*0.5
1126 & * max(velco(i,k),0.01)
1127 hd = sqrt(taup(i,k) / tem1)
1128 fro = brvf * hd * temv
1129!
1130! RIM is the MINIMUM-RICHARDSON NUMBER BY SHUTTS (1985)
1131!
1140
1141 tem2 = sqrt(ri_n(i,k))
1142 tem = 1. + tem2 * fro
1143 rim = ri_n(i,k) * (1.-fro) / (tem * tem)
1144!
1145! CHECK STABILITY TO EMPLOY THE 'SATURATION HYPOTHESIS'
1146! OF LINDZEN (1981) EXCEPT AT TROPOSPHERIC DOWNSTREAM REGIONS
1147!
1163! ----------------------
1164 IF (rim <= ric .AND.
1165! & (OA(I) .LE. 0. .OR. PRSI(ipt(I),KP1).LE.RLOLEV )) THEN
1166 & (oa(i) <= 0. .OR. kp1 >= kint(i) )) THEN
1167 temc = 2.0 + 1.0 / tem2
1168 hd = velco(i,k) * (2.*sqrt(temc)-temc) / brvf
1169 taup(i,kp1) = tem1 * hd * hd
1170 ELSE
1171 taup(i,kp1) = taup(i,k) * rscor
1172 ENDIF
1173 taup(i,kp1) = min(taup(i,kp1), taup(i,k))
1174 ENDIF
1175 ENDIF
1176 ENDDO
1177 ENDDO
1178!
1179! DO I=1,IM
1180! taup(i,km+1) = taup(i,km)
1181! ENDDO
1182!
1183 IF(lcap <= km) THEN
1184 DO klcap = lcapp1, km+1
1185 DO i = 1,npt
1186 sira = prsi(ipt(i),klcap) / prsi(ipt(i),lcap)
1187 taup(i,klcap) = sira * taup(i,lcap)
1188 ENDDO
1189 ENDDO
1190 ENDIF
1191!
1192! Calculate - (g/p*)*d(tau)/d(sigma) and Decel terms DTAUX, DTAUY
1193!
1194 DO k = 1,km
1195 DO i = 1,npt
1196 taud(i,k) = g * (taup(i,k+1) - taup(i,k)) / del(ipt(i),k)
1197 ENDDO
1198 ENDDO
1199!
1200!------LIMIT DE-ACCELERATION (MOMENTUM DEPOSITION ) AT TOP TO 1/2 VALUE
1201!------THE IDEA IS SOME STUFF MUST GO OUT THE 'TOP'
1202!
1203 DO klcap = lcap, km
1204 DO i = 1,npt
1205 taud(i,klcap) = taud(i,klcap) * factop
1206 ENDDO
1207 ENDDO
1208!
1209!------IF THE GRAVITY WAVE DRAG WOULD FORCE A CRITICAL LINE IN THE
1210!------LAYERS BELOW SIGMA=RLOLEV DURING THE NEXT DELTIM TIMESTEP,
1211!------THEN ONLY APPLY DRAG UNTIL THAT CRITICAL LINE IS REACHED.
1212!
1213 DO k = 1,kmm1
1214 DO i = 1,npt
1215 IF (k > kref(i) .and. prsi(ipt(i),k) >= rlolev) THEN
1216 IF(taud(i,k) /= 0.) THEN
1217 tem = deltim * taud(i,k)
1218 dtfac(i) = min(dtfac(i),abs(velco(i,k)/tem))
1219 ENDIF
1220 ENDIF
1221 ENDDO
1222 ENDDO
1223!
1224! if(lprnt .and. npr > 0) then
1225! print *,' before A=',A(npr,:)
1226! print *,' before B=',B(npr,:)
1227! endif
1228
1233
1234 DO k = 1,km
1235 DO i = 1,npt
1236 j = ipt(i)
1237 taud(i,k) = taud(i,k) * dtfac(i)
1238 dtaux = taud(i,k) * xn(i)
1239 dtauy = taud(i,k) * yn(i)
1240 eng0 = 0.5*(u1(j,k)*u1(j,k)+v1(j,k)*v1(j,k))
1241
1242 if (k < idxzb(i)) then ! --- lm mb (*j*) changes overwrite GWD
1243 ! ---------------------------------------
1244 dbim = db(i,k) / (1.+db(i,k)*deltim)
1245 a(j,k) = - dbim * v1(j,k)
1246 b(j,k) = - dbim * u1(j,k)
1247 eng1 = eng0*(1.0-dbim*deltim)*(1.0-dbim*deltim)
1248
1249! if ( ABS(DBIM * U1(J,K)) > .01 )
1250! & print *,' in gwdps_lmi.f KDT=',KDT,I,K,DB(I,K),
1251! & dbim,idxzb(I),U1(J,K),V1(J,K),me
1252
1253 tem1 = dbim * del(j,k)
1254 dusfc(j) = dusfc(j) + onebg * tem1 * u1(j,k)
1255 dvsfc(j) = dvsfc(j) + onebg * tem1 * v1(j,k)
1256 ! Output blocking tendencies if ldiag_ugwp=.true.
1257 if (ldiag_ugwp) then
1258 dtaux2d_bl(j,k) = - dbim * u1(j,k)
1259 dtauy2d_bl(j,k) = - dbim * v1(j,k)
1260 dusfc_bl(j) = dusfc_bl(j) + dtaux2d_bl(j,k) * del(j,k)
1261 dvsfc_bl(j) = dvsfc_bl(j) + dtauy2d_bl(j,k) * del(j,k)
1262 end if
1263 else ! orographic GWD applied
1264 ! ----------------------
1265 a(j,k) = dtauy
1266 b(j,k) = dtaux
1267 tem1 = u1(j,k) + dtaux*deltim
1268 tem2 = v1(j,k) + dtauy*deltim
1269 eng1 = 0.5 * (tem1*tem1+tem2*tem2)
1270 dusfc(j) = dusfc(j) - onebg * dtaux * del(j,k)
1271 dvsfc(j) = dvsfc(j) - onebg * dtauy * del(j,k)
1272 ! Output mesoscale GWD tendencies if ldiag_ugwp=.ture.
1273 if (ldiag_ugwp) then
1274 dtaux2d_ms(j,k) = dtaux
1275 dtauy2d_ms(j,k) = dtauy
1276 dusfc_ms(j) = dusfc_ms(j) + dtaux * del(j,k)
1277 dvsfc_ms(j) = dvsfc_ms(j) + dtauy * del(j,k)
1278 end if
1279 endif
1280 c(j,k) = max(eng0-eng1,0.) * oneocpdt
1281 ENDDO
1282 ENDDO
1283
1284! if (lprnt) then
1285! print *,' in gwdps_lm.f after A=',A(ipr,:)
1286! print *,' in gwdps_lm.f after B=',B(ipr,:)
1287! print *,' DB=',DB(ipr,:)
1288! endif
1289
1290 if (ldiag_ugwp) then
1291 ! Finalize dusfc and dvsfc diagnostics
1292 DO i = 1,npt
1293 j = ipt(i)
1294 dusfc_ms(j) = - onebg * dusfc_ms(j)
1295 dvsfc_ms(j) = - onebg * dvsfc_ms(j)
1296 dusfc_bl(j) = - onebg * dusfc_bl(j)
1297 dvsfc_bl(j) = - onebg * dvsfc_bl(j)
1298 ENDDO
1299 end if
1300!
1301! MONITOR FOR EXCESSIVE GRAVITY WAVE DRAG TENDENCIES IF NCNT>0
1302!
1303! IF(NCNT.GT.0) THEN
1304! IF(LAT.GE.38.AND.LAT.LE.42) THEN
1305!CMIC$ GUARD 37
1306! DO 92 I = 1,IM
1307! IF(IKOUNT.GT.NCNT) GO TO 92
1308! IF(I.LT.319.OR.I.GT.320) GO TO 92
1309! DO 91 K = 1,KM
1310! IF(ABS(TAUD(I,K)) .GT. CRITAC) THEN
1311! IF(I.LE.IM) THEN
1312! IKOUNT = IKOUNT+1
1313! PRINT 123,I,LAT,KDT
1314! PRINT 124,TAUB(I),BNV(I),ULOW(I),
1315! 1 GF(I),FR(I),ROLL(I),HPRIME(I),XN(I),YN(I)
1316! PRINT 124,(TAUD(I,KK),KK = 1,KM)
1317! PRINT 124,(TAUP(I,KK),KK = 1,KM+1)
1318! PRINT 124,(ri_n(I,KK),KK = 1,KM)
1319! DO 93 KK = 1,KMM1
1320! VELKO(KK) =
1321! 1 0.5*((U1(I,KK)+U1(I,KK+1))*UBAR(I)+
1322! 2 (V1(I,KK)+V1(I,KK+1))*VBAR(I))*ULOI(I)
1323!93 CONTINUE
1324! PRINT 124,(VELKO(KK),KK = 1,KMM1)
1325! PRINT 124,(A (I,KK),KK = 1,KM)
1326! PRINT 124,(DTAUY(I,KK),KK = 1,KM)
1327! PRINT 124,(B (I,KK),KK = 1,KM)
1328! PRINT 124,(DTAUX(I,KK),KK = 1,KM)
1329! GO TO 92
1330! ENDIF
1331! ENDIF
1332!91 CONTINUE
1333!92 CONTINUE
1334!CMIC$ END GUARD 37
1335!123 FORMAT(' *** MIGWD PRINT *** I=',I3,' LAT=',I3,' KDT=',I3)
1336!124 FORMAT(2X, 10E13.6)
1337! ENDIF
1338! ENDIF
1339!
1340! print *,' in gwdps_lm.f 18 =',A(ipt(1),idxzb(1))
1341! &, B(ipt(1),idxzb(1)),me
1342 RETURN
1343 end subroutine gwdps_run
1345 end module gwdps
subroutine gwdps_run(im, km, a, b, c, ten_q, u1, v1, t1, q1, kpbl, prsi, del, prsl, prslk, phii, phil, deltim, kdt, hprime, oc, oa4, clx4, theta, sigma, gamma, elvmax, dusfc, dvsfc, dtaux2d_ms, dtauy2d_ms, dtaux2d_bl, dtauy2d_bl, dusfc_ms, dvsfc_ms, dusfc_bl, dvsfc_bl, g, cp, rd, rv, imx, nmtvr, cdmbgwd, me, lprnt, ipr, rdxzb, ldiag_ugwp, errmsg, errflg)
Definition gwdps.f:203
This module contains the CCPP-compliant orographic gravity wave dray scheme. This version of gwdps is...
Definition gwdps.f:7