source: trunk/src/gridcheck.f90 @ 20

Last change on this file since 20 was 20, checked in by igpis, 10 years ago

move version 9.1.8 form branches to trunk. Contributions from HSO, saeck, pesei, NIK, RT, XKF, IP and others

  • Property svn:executable set to *
File size: 20.2 KB
RevLine 
[4]1!**********************************************************************
2! Copyright 1998,1999,2000,2001,2002,2005,2007,2008,2009,2010         *
3! Andreas Stohl, Petra Seibert, A. Frank, Gerhard Wotawa,             *
4! Caroline Forster, Sabine Eckhardt, John Burkhart, Harald Sodemann   *
5!                                                                     *
6! This file is part of FLEXPART.                                      *
7!                                                                     *
8! FLEXPART is free software: you can redistribute it and/or modify    *
9! it under the terms of the GNU General Public License as published by*
10! the Free Software Foundation, either version 3 of the License, or   *
11! (at your option) any later version.                                 *
12!                                                                     *
13! FLEXPART is distributed in the hope that it will be useful,         *
14! but WITHOUT ANY WARRANTY; without even the implied warranty of      *
15! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
16! GNU General Public License for more details.                        *
17!                                                                     *
18! You should have received a copy of the GNU General Public License   *
19! along with FLEXPART.  If not, see <http://www.gnu.org/licenses/>.   *
20!**********************************************************************
21
22subroutine gridcheck
23
24  !**********************************************************************
25  !                                                                     *
26  !             FLEXPART MODEL SUBROUTINE GRIDCHECK                     *
27  !                                                                     *
28  !**********************************************************************
29  !                                                                     *
30  !             AUTHOR:      G. WOTAWA                                  *
31  !             DATE:        1997-08-06                                 *
32  !             LAST UPDATE: 1997-10-10                                 *
33  !                                                                     *
34  !             Update:      1999-02-08, global fields allowed, A. Stohl*
35  !             CHANGE: 11/01/2008, Harald Sodemann, GRIB1/2 input with *
36  !                                 ECMWF grib_api                      *
37  !             CHANGE: 03/12/2008, Harald Sodemann, update to f90 with *
38  !                                 ECMWF grib_api                      *
39  !                                                                     *
40  !**********************************************************************
41  !                                                                     *
42  ! DESCRIPTION:                                                        *
43  !                                                                     *
44  ! THIS SUBROUTINE DETERMINES THE GRID SPECIFICATIONS (LOWER LEFT      *
45  ! LONGITUDE, LOWER LEFT LATITUDE, NUMBER OF GRID POINTS, GRID DIST-   *
46  ! ANCE AND VERTICAL DISCRETIZATION OF THE ECMWF MODEL) FROM THE       *
47  ! GRIB HEADER OF THE FIRST INPUT FILE. THE CONSISTANCY (NO CHANGES    *
48  ! WITHIN ONE FLEXPART RUN) IS CHECKED IN THE ROUTINE "READWIND" AT    *
49  ! ANY CALL.                                                           *
50  !                                                                     *
51  ! XLON0                geographical longitude of lower left gridpoint *
52  ! YLAT0                geographical latitude of lower left gridpoint  *
53  ! NX                   number of grid points x-direction              *
54  ! NY                   number of grid points y-direction              *
55  ! DX                   grid distance x-direction                      *
56  ! DY                   grid distance y-direction                      *
57  ! NUVZ                 number of grid points for horizontal wind      *
58  !                      components in z direction                      *
59  ! NWZ                  number of grid points for vertical wind        *
60  !                      component in z direction                       *
61  ! sizesouth, sizenorth give the map scale (i.e. number of virtual grid*
62  !                      points of the polar stereographic grid):       *
63  !                      used to check the CFL criterion                *
64  ! UVHEIGHT(1)-         heights of gridpoints where u and v are        *
65  ! UVHEIGHT(NUVZ)       given                                          *
66  ! WHEIGHT(1)-          heights of gridpoints where w is given         *
67  ! WHEIGHT(NWZ)                                                        *
68  !                                                                     *
69  !**********************************************************************
70
71  use grib_api
72  use par_mod
73  use com_mod
74  use conv_mod
75  use cmapf_mod, only: stlmbr,stcm2p
76
77  implicit none
78
79  !HSO  parameters for grib_api
80  integer :: ifile
81  integer :: iret
82  integer :: igrib
83  integer :: gotGrid
84  real(kind=4) :: xaux1,xaux2,yaux1,yaux2
85  real(kind=8) :: xaux1in,xaux2in,yaux1in,yaux2in
86  integer :: gribVer,parCat,parNum,typSurf,valSurf,discipl
87  !HSO  end
88  integer :: ix,jy,i,ifn,ifield,j,k,iumax,iwmax,numskip
89  real :: sizesouth,sizenorth,xauxa,pint
90
91  ! VARIABLES AND ARRAYS NEEDED FOR GRIB DECODING
92
93  ! dimension of isec2 at least (22+n), where n is the number of parallels or
94  ! meridians in a quasi-regular (reduced) Gaussian or lat/long grid
95
96  ! dimension of zsec2 at least (10+nn), where nn is the number of vertical
97  ! coordinate parameters
98
99  integer :: isec1(56),isec2(22+nxmax+nymax)
[20]100  !real(kind=4) :: zsec2(60+2*nuvzmax),zsec4(jpunp)
101  real(kind=4) :: zsec2(184),zsec4(jpunp)
[4]102  character(len=1) :: opt
103
104  !HSO  grib api error messages
105  character(len=24) :: gribErrorMsg = 'Error reading grib file'
106  character(len=20) :: gribFunction = 'gridcheck'
107
108  iumax=0
109  iwmax=0
110
111  if(ideltas.gt.0) then
112    ifn=1
113  else
114    ifn=numbwf
115  endif
116  !
117  ! OPENING OF DATA FILE (GRIB CODE)
118  !
1195   call grib_open_file(ifile,path(3)(1:length(3)) &
120         //trim(wfname(ifn)),'r',iret)
121  if (iret.ne.GRIB_SUCCESS) then
122    goto 999   ! ERROR DETECTED
123  endif
124  !turn on support for multi fields messages
125  !call grib_multi_support_on
126
127  gotGrid=0
128  ifield=0
12910   ifield=ifield+1
130
131  !
132  ! GET NEXT FIELDS
133  !
134  call grib_new_from_file(ifile,igrib,iret)
135  if (iret.eq.GRIB_END_OF_FILE )  then
136    goto 30    ! EOF DETECTED
137  elseif (iret.ne.GRIB_SUCCESS) then
138    goto 999   ! ERROR DETECTED
139  endif
140
141  !first see if we read GRIB1 or GRIB2
142  call grib_get_int(igrib,'editionNumber',gribVer,iret)
143  call grib_check(iret,gribFunction,gribErrorMsg)
144
145  if (gribVer.eq.1) then ! GRIB Edition 1
146
147  !print*,'GRiB Edition 1'
148  !read the grib2 identifiers
149  call grib_get_int(igrib,'indicatorOfParameter',isec1(6),iret)
150  call grib_check(iret,gribFunction,gribErrorMsg)
151  call grib_get_int(igrib,'level',isec1(8),iret)
152  call grib_check(iret,gribFunction,gribErrorMsg)
153
154  !change code for etadot to code for omega
155  if (isec1(6).eq.77) then
156    isec1(6)=135
157  endif
158
159  !print*,isec1(6),isec1(8)
160
161  else
162
163  !print*,'GRiB Edition 2'
164  !read the grib2 identifiers
165  call grib_get_int(igrib,'discipline',discipl,iret)
166  call grib_check(iret,gribFunction,gribErrorMsg)
167  call grib_get_int(igrib,'parameterCategory',parCat,iret)
168  call grib_check(iret,gribFunction,gribErrorMsg)
169  call grib_get_int(igrib,'parameterNumber',parNum,iret)
170  call grib_check(iret,gribFunction,gribErrorMsg)
171  call grib_get_int(igrib,'typeOfFirstFixedSurface',typSurf,iret)
172  call grib_check(iret,gribFunction,gribErrorMsg)
173  call grib_get_int(igrib,'level',valSurf,iret)
174  call grib_check(iret,gribFunction,gribErrorMsg)
175
176  !print*,discipl,parCat,parNum,typSurf,valSurf
177
178  !convert to grib1 identifiers
179  isec1(6)=-1
180  isec1(7)=-1
181  isec1(8)=-1
182  isec1(8)=valSurf     ! level
183  if ((parCat.eq.0).and.(parNum.eq.0).and.(typSurf.eq.105)) then ! T
184    isec1(6)=130         ! indicatorOfParameter
185  elseif ((parCat.eq.2).and.(parNum.eq.2).and.(typSurf.eq.105)) then ! U
186    isec1(6)=131         ! indicatorOfParameter
187  elseif ((parCat.eq.2).and.(parNum.eq.3).and.(typSurf.eq.105)) then ! V
188    isec1(6)=132         ! indicatorOfParameter
189  elseif ((parCat.eq.1).and.(parNum.eq.0).and.(typSurf.eq.105)) then ! Q
190    isec1(6)=133         ! indicatorOfParameter
191  elseif ((parCat.eq.3).and.(parNum.eq.0).and.(typSurf.eq.1)) then !SP
192    isec1(6)=134         ! indicatorOfParameter
193  elseif ((parCat.eq.2).and.(parNum.eq.32)) then ! W, actually eta dot
194    isec1(6)=135         ! indicatorOfParameter
195  elseif ((parCat.eq.3).and.(parNum.eq.0).and.(typSurf.eq.101)) then !SLP
196    isec1(6)=151         ! indicatorOfParameter
197  elseif ((parCat.eq.2).and.(parNum.eq.2).and.(typSurf.eq.103)) then ! 10U
198    isec1(6)=165         ! indicatorOfParameter
199  elseif ((parCat.eq.2).and.(parNum.eq.3).and.(typSurf.eq.103)) then ! 10V
200    isec1(6)=166         ! indicatorOfParameter
201  elseif ((parCat.eq.0).and.(parNum.eq.0).and.(typSurf.eq.103)) then ! 2T
202    isec1(6)=167         ! indicatorOfParameter
203  elseif ((parCat.eq.0).and.(parNum.eq.6).and.(typSurf.eq.103)) then ! 2D
204    isec1(6)=168         ! indicatorOfParameter
205  elseif ((parCat.eq.1).and.(parNum.eq.11).and.(typSurf.eq.1)) then ! SD
206    isec1(6)=141         ! indicatorOfParameter
207  elseif ((parCat.eq.6).and.(parNum.eq.1)) then ! CC
208    isec1(6)=164         ! indicatorOfParameter
209  elseif ((parCat.eq.1).and.(parNum.eq.9)) then ! LSP
210    isec1(6)=142         ! indicatorOfParameter
211  elseif ((parCat.eq.1).and.(parNum.eq.10)) then ! CP
212    isec1(6)=143         ! indicatorOfParameter
213  elseif ((parCat.eq.0).and.(parNum.eq.11).and.(typSurf.eq.1)) then ! SHF
214    isec1(6)=146         ! indicatorOfParameter
215  elseif ((parCat.eq.4).and.(parNum.eq.9).and.(typSurf.eq.1)) then ! SR
216    isec1(6)=176         ! indicatorOfParameter
217  elseif ((parCat.eq.2).and.(parNum.eq.17)) then ! EWSS
218    isec1(6)=180         ! indicatorOfParameter
219  elseif ((parCat.eq.2).and.(parNum.eq.18)) then ! NSSS
220    isec1(6)=181         ! indicatorOfParameter
221  elseif ((parCat.eq.3).and.(parNum.eq.4)) then ! ORO
222    isec1(6)=129         ! indicatorOfParameter
223  elseif ((parCat.eq.3).and.(parNum.eq.7)) then ! SDO
224    isec1(6)=160         ! indicatorOfParameter
225  elseif ((discipl.eq.2).and.(parCat.eq.0).and.(parNum.eq.0).and. &
226       (typSurf.eq.1)) then ! LSM
227    isec1(6)=172         ! indicatorOfParameter
228  else
229    print*,'***ERROR: undefined GRiB2 message found!',discipl, &
230         parCat,parNum,typSurf
231  endif
232
233  endif
234
235  !get the size and data of the values array
236  if (isec1(6).ne.-1) then
237    call grib_get_real4_array(igrib,'values',zsec4,iret)
238    call grib_check(iret,gribFunction,gribErrorMsg)
239  endif
240
241  if (ifield.eq.1) then
242
243  !HSO  get the required fields from section 2 in a gribex compatible manner
244    call grib_get_int(igrib,'numberOfPointsAlongAParallel', &
245         isec2(2),iret)
246    call grib_check(iret,gribFunction,gribErrorMsg)
247    call grib_get_int(igrib,'numberOfPointsAlongAMeridian', &
248         isec2(3),iret)
249    call grib_check(iret,gribFunction,gribErrorMsg)
250    call grib_get_real8(igrib,'longitudeOfFirstGridPointInDegrees', &
251         xaux1in,iret)
252    call grib_check(iret,gribFunction,gribErrorMsg)
253    call grib_get_int(igrib,'numberOfVerticalCoordinateValues', &
254         isec2(12),iret)
255    call grib_check(iret,gribFunction,gribErrorMsg)
256
257  !  get the size and data of the vertical coordinate array
258    call grib_get_real4_array(igrib,'pv',zsec2,iret)
259    call grib_check(iret,gribFunction,gribErrorMsg)
260
261    nxfield=isec2(2)
262    ny=isec2(3)
263    nlev_ec=isec2(12)/2-1
264   endif
265
266  !HSO  get the second part of the grid dimensions only from GRiB1 messages
267  if ((gribVer.eq.1).and.(gotGrid.eq.0)) then
268    call grib_get_real8(igrib,'longitudeOfLastGridPointInDegrees', &
269         xaux2in,iret)
270    call grib_check(iret,gribFunction,gribErrorMsg)
271    call grib_get_real8(igrib,'latitudeOfLastGridPointInDegrees', &
272         yaux1in,iret)
273    call grib_check(iret,gribFunction,gribErrorMsg)
274    call grib_get_real8(igrib,'latitudeOfFirstGridPointInDegrees', &
275         yaux2in,iret)
276    call grib_check(iret,gribFunction,gribErrorMsg)
277    xaux1=xaux1in
278    xaux2=xaux2in
279    yaux1=yaux1in
280    yaux2=yaux2in
281    if (xaux1.gt.180.) xaux1=xaux1-360.0
282    if (xaux2.gt.180.) xaux2=xaux2-360.0
283    if (xaux1.lt.-180.) xaux1=xaux1+360.0
284    if (xaux2.lt.-180.) xaux2=xaux2+360.0
285    if (xaux2.lt.xaux1) xaux2=xaux2+360.0
286    xlon0=xaux1
287    ylat0=yaux1
288    dx=(xaux2-xaux1)/real(nxfield-1)
289    dy=(yaux2-yaux1)/real(ny-1)
290    dxconst=180./(dx*r_earth*pi)
291    dyconst=180./(dy*r_earth*pi)
292    gotGrid=1
293
294  ! Check whether fields are global
295  ! If they contain the poles, specify polar stereographic map
296  ! projections using the stlmbr- and stcm2p-calls
297  !***********************************************************
298
299    xauxa=abs(xaux2+dx-360.-xaux1)
300    if (xauxa.lt.0.001) then
301      nx=nxfield+1                 ! field is cyclic
302      xglobal=.true.
303      if (abs(nxshift).ge.nx) &
304           stop 'nxshift in file par_mod is too large'
305      xlon0=xlon0+real(nxshift)*dx
306    else
307      nx=nxfield
308      xglobal=.false.
309      if (nxshift.ne.0) &
310           stop 'nxshift (par_mod) must be zero for non-global domain'
311    endif
312    nxmin1=nx-1
313    nymin1=ny-1
314    if (xlon0.gt.180.) xlon0=xlon0-360.
315    xauxa=abs(yaux1+90.)
316    if (xglobal.and.xauxa.lt.0.001) then
317      sglobal=.true.               ! field contains south pole
318  ! Enhance the map scale by factor 3 (*2=6) compared to north-south
319  ! map scale
320      sizesouth=6.*(switchsouth+90.)/dy
321      call stlmbr(southpolemap,-90.,0.)
322      call stcm2p(southpolemap,0.,0.,switchsouth,0.,sizesouth, &
323           sizesouth,switchsouth,180.)
324      switchsouthg=(switchsouth-ylat0)/dy
325    else
326      sglobal=.false.
327      switchsouthg=999999.
328    endif
329    xauxa=abs(yaux2-90.)
330    if (xglobal.and.xauxa.lt.0.001) then
331      nglobal=.true.               ! field contains north pole
332  ! Enhance the map scale by factor 3 (*2=6) compared to north-south
333  ! map scale
334      sizenorth=6.*(90.-switchnorth)/dy
335      call stlmbr(northpolemap,90.,0.)
336      call stcm2p(northpolemap,0.,0.,switchnorth,0.,sizenorth, &
337           sizenorth,switchnorth,180.)
338      switchnorthg=(switchnorth-ylat0)/dy
339    else
340      nglobal=.false.
341      switchnorthg=999999.
342    endif
343    if (nxshift.lt.0) &
344         stop 'nxshift (par_mod) must not be negative'
345    if (nxshift.ge.nxfield) stop 'nxshift (par_mod) too large'
346  endif ! gotGrid
347
348  k=isec1(8)
349  if(isec1(6).eq.131) iumax=max(iumax,nlev_ec-k+1)
350  if(isec1(6).eq.135) iwmax=max(iwmax,nlev_ec-k+1)
351
352  if(isec1(6).eq.129) then
353    do jy=0,ny-1
354      do ix=0,nxfield-1
355        oro(ix,jy)=zsec4(nxfield*(ny-jy-1)+ix+1)/ga
356      end do
357    end do
358  endif
359  if(isec1(6).eq.172) then
360    do jy=0,ny-1
361      do ix=0,nxfield-1
362        lsm(ix,jy)=zsec4(nxfield*(ny-jy-1)+ix+1)
363      end do
364    end do
365  endif
366  if(isec1(6).eq.160) then
367    do jy=0,ny-1
368      do ix=0,nxfield-1
369        excessoro(ix,jy)=zsec4(nxfield*(ny-jy-1)+ix+1)
370      end do
371    end do
372  endif
373
374  call grib_release(igrib)
375  goto 10                      !! READ NEXT LEVEL OR PARAMETER
376  !
377  ! CLOSING OF INPUT DATA FILE
378  !
379
38030   call grib_close_file(ifile)
381
382  !error message if no fields found with correct first longitude in it
383  if (gotGrid.eq.0) then
384    print*,'***ERROR: input file needs to contain GRiB1 formatted'// &
385         'messages'
386    stop
387  endif
388
389  nuvz=iumax
390  nwz =iwmax
391  if(nuvz.eq.nlev_ec) nwz=nlev_ec+1
392
393  if (nx.gt.nxmax) then
394   write(*,*) 'FLEXPART error: Too many grid points in x direction.'
395    write(*,*) 'Reduce resolution of wind fields.'
396    write(*,*) 'Or change parameter settings in file par_mod.'
397    write(*,*) nx,nxmax
398    stop
399  endif
400
401  if (ny.gt.nymax) then
402   write(*,*) 'FLEXPART error: Too many grid points in y direction.'
403    write(*,*) 'Reduce resolution of wind fields.'
404    write(*,*) 'Or change parameter settings in file par_mod.'
405    write(*,*) ny,nymax
406    stop
407  endif
408
409  if (nuvz+1.gt.nuvzmax) then
410    write(*,*) 'FLEXPART error: Too many u,v grid points in z '// &
411         'direction.'
412    write(*,*) 'Reduce resolution of wind fields.'
413    write(*,*) 'Or change parameter settings in file par_mod.'
414    write(*,*) nuvz+1,nuvzmax
415    stop
416  endif
417
418  if (nwz.gt.nwzmax) then
419    write(*,*) 'FLEXPART error: Too many w grid points in z '// &
420         'direction.'
421    write(*,*) 'Reduce resolution of wind fields.'
422    write(*,*) 'Or change parameter settings in file par_mod.'
423    write(*,*) nwz,nwzmax
424    stop
425  endif
426
427  ! If desired, shift all grids by nxshift grid cells
428  !**************************************************
429
430  if (xglobal) then
431    call shift_field_0(oro,nxfield,ny)
432    call shift_field_0(lsm,nxfield,ny)
433    call shift_field_0(excessoro,nxfield,ny)
434  endif
435
436  ! Output of grid info
437  !********************
438
439  write(*,*)
440  write(*,*)
441  write(*,'(a,2i7)') '# of vertical levels in ECMWF data: ', &
442       nuvz+1,nwz
443  write(*,*)
444  write(*,'(a)') 'Mother domain:'
445  write(*,'(a,f10.2,a1,f10.2,a,f10.2)') '  Longitude range: ', &
446       xlon0,' to ',xlon0+(nx-1)*dx,'   Grid distance: ',dx
447  write(*,'(a,f10.2,a1,f10.2,a,f10.2)') '  Latitude range: ', &
448       ylat0,' to ',ylat0+(ny-1)*dy,'   Grid distance: ',dy
449  write(*,*)
450
451
452  ! CALCULATE VERTICAL DISCRETIZATION OF ECMWF MODEL
453  ! PARAMETER akm,bkm DESCRIBE THE HYBRID "ETA" COORDINATE SYSTEM
454
455  numskip=nlev_ec-nuvz  ! number of ecmwf model layers not used
456                        ! by trajectory model
457  !do 8940 i=1,244
458  !   write (*,*) 'zsec2:',i,ifield,zsec2(i),numskip
459  !940  continue
460  !   stop
461  ! SEC SEC SEC
462  ! for unknown reason zsec 1 to 10 is filled in this version
463  ! compared to the old one
464  ! SEC SEC SE
465  do i=1,nwz
466    j=numskip+i
467    k=nlev_ec+1+numskip+i
468    akm(nwz-i+1)=zsec2(j)
469    bkm(nwz-i+1)=zsec2(k)
470  end do
471
472  !
473  ! CALCULATION OF AKZ, BKZ
474  ! AKZ,BKZ: model discretization parameters at the center of each model
475  !     layer
476  !
477  ! Assign the 10 m winds to an artificial model level with akz=0 and bkz=1.0,
478  ! i.e. ground level
479  !*****************************************************************************
480
481  akz(1)=0.
482  bkz(1)=1.0
483  do i=1,nuvz
484     akz(i+1)=0.5*(akm(i+1)+akm(i))
485     bkz(i+1)=0.5*(bkm(i+1)+bkm(i))
486  end do
487  nuvz=nuvz+1
488
489  ! NOTE: In FLEXPART versions up to 4.0, the number of model levels was doubled
490  ! upon the transformation to z levels. In order to save computer memory, this is
491  ! not done anymore in the standard version. However, this option can still be
492  ! switched on by replacing the following lines with those below, that are
493  ! currently commented out. For this, similar changes are necessary in
494  ! verttransform.f and verttranform_nests.f
495  !*****************************************************************************
496
497  nz=nuvz
498  if (nz.gt.nzmax) stop 'nzmax too small'
499  do i=1,nuvz
500    aknew(i)=akz(i)
501    bknew(i)=bkz(i)
502  end do
503
504  ! Switch on following lines to use doubled vertical resolution
505  !*************************************************************
506  !nz=nuvz+nwz-1
507  !if (nz.gt.nzmax) stop 'nzmax too small'
508  !do 100 i=1,nwz
509  !  aknew(2*(i-1)+1)=akm(i)
510  !00     bknew(2*(i-1)+1)=bkm(i)
511  !do 110 i=2,nuvz
512  !  aknew(2*(i-1))=akz(i)
513  !10     bknew(2*(i-1))=bkz(i)
514  ! End doubled vertical resolution
515
516
517  ! Determine the uppermost level for which the convection scheme shall be applied
518  ! by assuming that there is no convection above 50 hPa (for standard SLP)
519  !*****************************************************************************
520
521  do i=1,nuvz-2
522    pint=akz(i)+bkz(i)*101325.
523    if (pint.lt.5000.) goto 96
524  end do
52596   nconvlev=i
526  if (nconvlev.gt.nconvlevmax-1) then
527    nconvlev=nconvlevmax-1
528    write(*,*) 'Attention, convection only calculated up to ', &
529         akz(nconvlev)+bkz(nconvlev)*1013.25,' hPa'
530  endif
531
532  return
533
534999   write(*,*)
535  write(*,*) ' ###########################################'// &
536       '###### '
537  write(*,*) '       TRAJECTORY MODEL SUBROUTINE GRIDCHECK:'
538  write(*,*) ' CAN NOT OPEN INPUT DATA FILE '//wfname(ifn)
539  write(*,*) ' ###########################################'// &
540       '###### '
541  write(*,*)
542  write(*,'(a)') '!!! PLEASE INSERT A NEW CD-ROM AND   !!!'
543  write(*,'(a)') '!!! PRESS ANY KEY TO CONTINUE...     !!!'
544  write(*,'(a)') '!!! ...OR TERMINATE FLEXPART PRESSING!!!'
545  write(*,'(a)') '!!! THE "X" KEY...                   !!!'
546  write(*,*)
547  read(*,'(a)') opt
548  if(opt.eq.'X') then
549    stop
550  else
551    goto 5
552  endif
553
554end subroutine gridcheck
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG