File: readoutgrid.f90

package info (click to toggle)
flexpart 9.02-27
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,944 kB
  • sloc: f90: 14,310; makefile: 29; sh: 18
file content (188 lines) | stat: -rw-r--r-- 7,319 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
!**********************************************************************
! Copyright 1998,1999,2000,2001,2002,2005,2007,2008,2009,2010         *
! Andreas Stohl, Petra Seibert, A. Frank, Gerhard Wotawa,             *
! Caroline Forster, Sabine Eckhardt, John Burkhart, Harald Sodemann   *
!                                                                     *
! This file is part of FLEXPART.                                      *
!                                                                     *
! FLEXPART is free software: you can redistribute it and/or modify    *
! it under the terms of the GNU General Public License as published by*
! the Free Software Foundation, either version 3 of the License, or   *
! (at your option) any later version.                                 *
!                                                                     *
! FLEXPART is distributed in the hope that it will be useful,         *
! but WITHOUT ANY WARRANTY; without even the implied warranty of      *
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
! GNU General Public License for more details.                        *
!                                                                     *
! You should have received a copy of the GNU General Public License   *
! along with FLEXPART.  If not, see <http://www.gnu.org/licenses/>.   *
!**********************************************************************

subroutine readoutgrid

  !*****************************************************************************
  !                                                                            *
  !     This routine reads the user specifications for the output grid.        *
  !                                                                            *
  !     Author: A. Stohl                                                       *
  !                                                                            *
  !     4 June 1996                                                            *
  !                                                                            *
  !*****************************************************************************
  !                                                                            *
  ! Variables:                                                                 *
  ! dxout,dyout          grid distance                                         *
  ! numxgrid,numygrid,numzgrid    grid dimensions                              *
  ! outlon0,outlat0      lower left corner of grid                             *
  ! outheight(maxzgrid)  height levels of output grid [m]                      *
  !                                                                            *
  ! Constants:                                                                 *
  ! unitoutgrid          unit connected to file OUTGRID                        *
  !                                                                            *
  !*****************************************************************************

  use outg_mod
  use par_mod
  use com_mod

  implicit none

  integer :: i,j,stat
  real :: outhelp,xr,xr1,yr,yr1
  real,parameter :: eps=1.e-4



  ! Open the OUTGRID file and read output grid specifications
  !**********************************************************

  open(unitoutgrid,file=path(1)(1:length(1))//'OUTGRID',status='old', &
       err=999)


  call skplin(5,unitoutgrid)


  ! 1.  Read horizontal grid specifications
  !****************************************

  call skplin(3,unitoutgrid)
  read(unitoutgrid,'(4x,f11.4)') outlon0
  call skplin(3,unitoutgrid)
  read(unitoutgrid,'(4x,f11.4)') outlat0
  call skplin(3,unitoutgrid)
  read(unitoutgrid,'(4x,i5)') numxgrid
  call skplin(3,unitoutgrid)
  read(unitoutgrid,'(4x,i5)') numygrid
  call skplin(3,unitoutgrid)
  read(unitoutgrid,'(4x,f12.5)') dxout
  call skplin(3,unitoutgrid)
  read(unitoutgrid,'(4x,f12.5)') dyout


  ! Check validity of output grid (shall be within model domain)
  !*************************************************************

  xr=outlon0+real(numxgrid)*dxout
  yr=outlat0+real(numygrid)*dyout
  xr1=xlon0+real(nxmin1)*dx
  yr1=ylat0+real(nymin1)*dy
  if ((outlon0+eps.lt.xlon0).or.(outlat0+eps.lt.ylat0) &
       .or.(xr.gt.xr1+eps).or.(yr.gt.yr1+eps)) then
    write(*,*) outlon0,outlat0
    write(*,*) xr1,yr1,xlon0,ylat0,xr,yr,dxout,dyout
    write(*,*) ' #### FLEXPART MODEL ERROR! PART OF OUTPUT    ####'
    write(*,*) ' #### GRID IS OUTSIDE MODEL DOMAIN. CHANGE    ####'
    write(*,*) ' #### FILE OUTGRID IN DIRECTORY               ####'
    write(*,'(a)') path(1)(1:length(1))
    stop
  endif

  ! 2. Count Vertical levels of output grid
  !****************************************
  j=0
100   j=j+1
    do i=1,3
      read(unitoutgrid,*,end=99)
    end do
    read(unitoutgrid,'(4x,f7.1)',end=99) outhelp
    if (outhelp.eq.0.) goto 99
    goto 100
99   numzgrid=j-1

    allocate(outheight(numzgrid) &
         ,stat=stat)
    if (stat.ne.0) write(*,*)'ERROR: could not allocate outh'
    allocate(outheighthalf(numzgrid) &
         ,stat=stat)
    if (stat.ne.0) write(*,*)'ERROR: could not allocate outh'


  rewind(unitoutgrid)
  call skplin(29,unitoutgrid)

  ! 2. Vertical levels of output grid
  !**********************************

  j=0
1000   j=j+1
    do i=1,3
      read(unitoutgrid,*,end=990)
    end do
    read(unitoutgrid,'(4x,f7.1)',end=990) outhelp
    if (outhelp.eq.0.) goto 99
    outheight(j)=outhelp
    goto 1000
990   numzgrid=j-1


  ! Check whether vertical levels are specified in ascending order
  !***************************************************************

  do j=2,numzgrid
    if (outheight(j).le.outheight(j-1)) then
    write(*,*) ' #### FLEXPART MODEL ERROR! YOUR SPECIFICATION#### '
    write(*,*) ' #### OF OUTPUT LEVELS IS CORRUPT AT LEVEL    #### '
    write(*,*) ' #### ',j,'                              #### '
    write(*,*) ' #### PLEASE MAKE CHANGES IN FILE OUTGRID.    #### '
    endif
  end do

  ! Determine the half levels, i.e. middle levels of the output grid
  !*****************************************************************

  outheighthalf(1)=outheight(1)/2.
  do j=2,numzgrid
    outheighthalf(j)=(outheight(j-1)+outheight(j))/2.
  end do


  xoutshift=xlon0-outlon0
  youtshift=ylat0-outlat0
  close(unitoutgrid)

    allocate(oroout(0:numxgrid-1,0:numygrid-1) &
         ,stat=stat)
    if (stat.ne.0) write(*,*)'ERROR: could not allocate outh'
    allocate(area(0:numxgrid-1,0:numygrid-1) &
         ,stat=stat)
    if (stat.ne.0) write(*,*)'ERROR: could not allocate outh'
    allocate(volume(0:numxgrid-1,0:numygrid-1,numzgrid) &
         ,stat=stat)
    if (stat.ne.0) write(*,*)'ERROR: could not allocate outh'
    allocate(areaeast(0:numxgrid-1,0:numygrid-1,numzgrid) &
         ,stat=stat)
    if (stat.ne.0) write(*,*)'ERROR: could not allocate outh'
    allocate(areanorth(0:numxgrid-1,0:numygrid-1,numzgrid) &
         ,stat=stat)
    if (stat.ne.0) write(*,*)'ERROR: could not allocate outh'
  return


999   write(*,*) ' #### FLEXPART MODEL ERROR! FILE "OUTGRID"    #### '
  write(*,*) ' #### CANNOT BE OPENED IN THE DIRECTORY       #### '
  write(*,*) ' #### xxx/flexpart/options                    #### '
  stop

end subroutine readoutgrid