Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/readreleases.f90

    r27 r20  
    3333  !     Update: 29 January 2001                                                *
    3434  !     Release altitude can be either in magl or masl                         *
    35   !     HSO, 12 August 2013
    36   !     Added optional namelist input
    3735  !                                                                            *
    3836  !*****************************************************************************
     
    5755  ! xpoint2,ypoint2     geograf. coordinates of upper right corner of release  *
    5856  !                     area                                                   *
    59   ! weta, wetb          parameters to determine the below-cloud scavenging     *
    60   ! weta_in, wetb_in    parameters to determine the in-cloud scavenging        *
    61   ! wetc_in, wetd_in    parameters to determine the in-cloud scavenging        *
     57  ! weta, wetb          parameters to determine the wet scavenging coefficient *
    6258  ! zpoint1,zpoint2     height range, over which release takes place           *
    6359  ! num_min_discrete    if less, release cannot be randomized and happens at   *
     
    7369  implicit none
    7470
    75   integer :: numpartmax,i,j,id1,it1,id2,it2,idum,stat
     71  integer :: numpartmax,i,j,id1,it1,id2,it2,specnum_rel,idum,stat
    7672  integer,parameter :: num_min_discrete=100
    7773  real :: vsh(ni),fracth(ni),schmih(ni),releaserate,xdum,cun
     
    8076  logical :: old
    8177
    82   ! help variables for namelist reading
    83   integer :: numpoints, parts, readerror
    84   integer*2 :: zkind
    85   integer :: idate1, itime1, idate2, itime2
    86   real :: lon1,lon2,lat1,lat2,z1,z2
    87   character*40 :: comment
    88   integer,parameter :: unitreleasesout=2
    89   real,allocatable, dimension (:) :: mass
    90   integer,allocatable, dimension (:) :: specnum_rel,specnum_rel2
    91 
    92   ! declare namelists
    93   namelist /releases_ctrl/ &
    94     nspec, &
    95     specnum_rel
    96 
    97   namelist /release/ &
    98     idate1, itime1, &
    99     idate2, itime2, &
    100     lon1, lon2, &
    101     lat1, lat2, &
    102     z1, z2, &
    103     zkind, &
    104     mass, &
    105     parts, &
    106     comment
     78  !sec, read release to find how many releasepoints should be allocated
     79
     80  open(unitreleases,file=path(1)(1:length(1))//'RELEASES',status='old', &
     81       err=999)
     82
     83  ! Check the format of the RELEASES file (either in free format,
     84  ! or using a formatted mask)
     85  ! Use of formatted mask is assumed if line 10 contains the word 'DIRECTION'
     86  !**************************************************************************
     87
     88  call skplin(12,unitreleases)
     89  read (unitreleases,901) line
     90901   format (a)
     91  if (index(line,'Total') .eq. 0) then
     92    old = .false.
     93  else
     94    old = .true.
     95  endif
     96  rewind(unitreleases)
     97
     98
     99  ! Skip first 11 lines (file header)
     100  !**********************************
     101
     102  call skplin(11,unitreleases)
     103
     104
     105  read(unitreleases,*,err=998) nspec
     106  if (old) call skplin(2,unitreleases)
     107  do i=1,nspec
     108    read(unitreleases,*,err=998) specnum_rel
     109    if (old) call skplin(2,unitreleases)
     110  end do
    107111
    108112  numpoint=0
    109 
    110   ! allocate with maxspec for first input loop
    111   allocate(mass(maxspec),stat=stat)
    112   if (stat.ne.0) write(*,*)'ERROR: could not allocate mass'
    113   allocate(specnum_rel(maxspec),stat=stat)
    114   if (stat.ne.0) write(*,*)'ERROR: could not allocate specnum_rel'
    115 
    116   ! presetting namelist releases_ctrl
    117   nspec = -1  ! use negative value to determine failed namelist input
    118   specnum_rel = 0
    119 
    120   !sec, read release to find how many releasepoints should be allocated
    121   open(unitreleases,file=path(1)(1:length(1))//'RELEASES',status='old',form='formatted',err=999)
    122 
    123   ! check if namelist input provided
    124   read(unitreleases,releases_ctrl,iostat=readerror)
    125 
    126   ! prepare namelist output if requested
    127   if (nmlout.eqv..true.) then
    128     open(unitreleasesout,file=path(2)(1:length(2))//'RELEASES.namelist',access='append',status='new',err=1000)
    129   endif
    130 
    131   if ((readerror.ne.0).or.(nspec.lt.0)) then
    132 
    133     ! no namelist format, close file and allow reopening in old format
    134     close(unitreleases)
    135     open(unitreleases,file=path(1)(1:length(1))//'RELEASES',status='old',err=999)
    136 
    137     readerror=1 ! indicates old format
    138 
    139     ! Check the format of the RELEASES file (either in free format,
    140     ! or using a formatted mask)
    141     ! Use of formatted mask is assumed if line 10 contains the word 'DIRECTION'
    142     !**************************************************************************
    143 
    144     call skplin(12,unitreleases)
    145     read (unitreleases,901) line
    146 901 format (a)
    147     if (index(line,'Total') .eq. 0) then
    148       old = .false.
    149     else
    150       old = .true.
    151     endif
    152     rewind(unitreleases)
    153 
    154 
    155     ! Skip first 11 lines (file header)
    156     !**********************************
    157 
    158     call skplin(11,unitreleases)
    159 
    160     read(unitreleases,*,err=998) nspec
    161     if (old) call skplin(2,unitreleases)
    162     do i=1,nspec
    163       read(unitreleases,*,err=998) specnum_rel(i)
    164       if (old) call skplin(2,unitreleases)
    165     end do
    166 
    167     numpoint=0
    168 100 numpoint=numpoint+1
    169     read(unitreleases,*,end=25)
    170     read(unitreleases,*,err=998,end=25) idum,idum
    171     if (old) call skplin(2,unitreleases)
    172     read(unitreleases,*,err=998) idum,idum
    173     if (old) call skplin(2,unitreleases)
     113100   numpoint=numpoint+1
     114  read(unitreleases,*,end=25)
     115  read(unitreleases,*,err=998,end=25) idum,idum
     116  if (old) call skplin(2,unitreleases)
     117  read(unitreleases,*,err=998) idum,idum
     118  if (old) call skplin(2,unitreleases)
     119  read(unitreleases,*,err=998) xdum
     120  if (old) call skplin(2,unitreleases)
     121  read(unitreleases,*,err=998) xdum
     122  if (old) call skplin(2,unitreleases)
     123  read(unitreleases,*,err=998) xdum
     124  if (old) call skplin(2,unitreleases)
     125  read(unitreleases,*,err=998) xdum
     126  if (old) call skplin(2,unitreleases)
     127  read(unitreleases,*,err=998) idum
     128  if (old) call skplin(2,unitreleases)
     129  read(unitreleases,*,err=998) xdum
     130  if (old) call skplin(2,unitreleases)
     131  read(unitreleases,*,err=998) xdum
     132  if (old) call skplin(2,unitreleases)
     133  read(unitreleases,*,err=998) idum
     134  if (old) call skplin(2,unitreleases)
     135  do i=1,nspec
    174136    read(unitreleases,*,err=998) xdum
    175137    if (old) call skplin(2,unitreleases)
    176     read(unitreleases,*,err=998) xdum
    177     if (old) call skplin(2,unitreleases)
    178     read(unitreleases,*,err=998) xdum
    179     if (old) call skplin(2,unitreleases)
    180     read(unitreleases,*,err=998) xdum
    181     if (old) call skplin(2,unitreleases)
    182     read(unitreleases,*,err=998) idum
    183     if (old) call skplin(2,unitreleases)
    184     read(unitreleases,*,err=998) xdum
    185     if (old) call skplin(2,unitreleases)
    186     read(unitreleases,*,err=998) xdum
    187     if (old) call skplin(2,unitreleases)
    188     read(unitreleases,*,err=998) idum
    189     if (old) call skplin(2,unitreleases)
    190     do i=1,nspec
    191       read(unitreleases,*,err=998) xdum
    192       if (old) call skplin(2,unitreleases)
    193     end do
    194     !save compoint only for the first 1000 release points
    195     read(unitreleases,'(a40)',err=998) compoint(1)(1:40)
    196     if (old) call skplin(1,unitreleases)
    197 
    198     goto 100
    199 
    200 25  numpoint=numpoint-1
    201 
    202   else
    203 
    204     readerror=0
    205     do while (readerror.eq.0)
    206       idate1=-1
    207       read(unitreleases,release,iostat=readerror)
    208       if ((idate1.lt.0).or.(readerror.ne.0)) then
    209         readerror=1
    210       else
    211         numpoint=numpoint+1
    212       endif
    213     end do
    214     readerror=0
    215   endif ! if namelist input
    216 
    217   rewind(unitreleases)
    218 
    219   ! allocate arrays of matching size for number of species (namelist output)
    220   deallocate(mass)
    221   allocate(mass(nspec),stat=stat)
    222   if (stat.ne.0) write(*,*)'ERROR: could not allocate mass'
    223   allocate(specnum_rel2(nspec),stat=stat)
    224   if (stat.ne.0) write(*,*)'ERROR: could not allocate specnum_rel2'
    225   specnum_rel2=specnum_rel(1:nspec)
    226   deallocate(specnum_rel)
    227   allocate(specnum_rel(nspec),stat=stat)
    228   if (stat.ne.0) write(*,*)'ERROR: could not allocate specnum_rel'
    229   specnum_rel=specnum_rel2
    230   deallocate(specnum_rel2)
    231 
    232   !allocate memory for numpoint releaspoints
    233   allocate(ireleasestart(numpoint),stat=stat)
    234   if (stat.ne.0) write(*,*)'ERROR: could not allocate ireleasestart'
    235   allocate(ireleaseend(numpoint),stat=stat)
    236   if (stat.ne.0) write(*,*)'ERROR: could not allocate ireleaseend'
    237   allocate(xpoint1(numpoint),stat=stat)
    238   if (stat.ne.0) write(*,*)'ERROR: could not allocate xpoint1'
    239   allocate(xpoint2(numpoint),stat=stat)
    240   if (stat.ne.0) write(*,*)'ERROR: could not allocate xpoint2'
    241   allocate(ypoint1(numpoint),stat=stat)
    242   if (stat.ne.0) write(*,*)'ERROR: could not allocate ypoint1'
    243   allocate(ypoint2(numpoint),stat=stat)
    244   if (stat.ne.0) write(*,*)'ERROR: could not allocate ypoint2'
    245   allocate(zpoint1(numpoint),stat=stat)
    246   if (stat.ne.0) write(*,*)'ERROR: could not allocate zpoint1'
    247   allocate(zpoint2(numpoint),stat=stat)
    248   if (stat.ne.0) write(*,*)'ERROR: could not allocate zpoint2'
    249   allocate(kindz(numpoint),stat=stat)
    250   if (stat.ne.0) write(*,*)'ERROR: could not allocate kindz'
    251   allocate(xmass(numpoint,maxspec),stat=stat)
    252   if (stat.ne.0) write(*,*)'ERROR: could not allocate xmass'
    253   allocate(rho_rel(numpoint),stat=stat)
    254   if (stat.ne.0) write(*,*)'ERROR: could not allocate rho_rel'
    255   allocate(npart(numpoint),stat=stat)
    256   if (stat.ne.0) write(*,*)'ERROR: could not allocate npart'
    257   allocate(xmasssave(numpoint),stat=stat)
    258   if (stat.ne.0) write(*,*)'ERROR: could not allocate xmasssave'
    259 
    260   write (*,*) 'Releasepoints : ', numpoint
    261 
    262   do i=1,numpoint
    263     xmasssave(i)=0.
    264138  end do
     139  !save compoint only for the first 1000 release points
     140  read(unitreleases,'(a40)',err=998) compoint(1)(1:40)
     141  if (old) call skplin(1,unitreleases)
     142
     143  goto 100
     144
     14525   numpoint=numpoint-1
     146
     147  !allocate memory for numpoint releaspoint
     148    allocate(ireleasestart(numpoint) &
     149         ,stat=stat)
     150    if (stat.ne.0) write(*,*)'ERROR: could not allocate RELEASPOINT'
     151    allocate(ireleaseend(numpoint) &
     152         ,stat=stat)
     153    if (stat.ne.0) write(*,*)'ERROR: could not allocate RELEASPOINT'
     154    allocate(xpoint1(numpoint) &
     155         ,stat=stat)
     156    if (stat.ne.0) write(*,*)'ERROR: could not allocate RELEASPOINT'
     157    allocate(xpoint2(numpoint) &
     158         ,stat=stat)
     159    if (stat.ne.0) write(*,*)'ERROR: could not allocate RELEASPOINT'
     160    allocate(ypoint1(numpoint) &
     161         ,stat=stat)
     162    if (stat.ne.0) write(*,*)'ERROR: could not allocate RELEASPOINT'
     163    allocate(ypoint2(numpoint) &
     164         ,stat=stat)
     165    if (stat.ne.0) write(*,*)'ERROR: could not allocate RELEASPOINT'
     166    allocate(zpoint1(numpoint) &
     167         ,stat=stat)
     168    if (stat.ne.0) write(*,*)'ERROR: could not allocate RELEASPOINT'
     169    allocate(zpoint2(numpoint) &
     170         ,stat=stat)
     171    if (stat.ne.0) write(*,*)'ERROR: could not allocate RELEASPOINT'
     172    allocate(kindz(numpoint) &
     173         ,stat=stat)
     174    if (stat.ne.0) write(*,*)'ERROR: could not allocate RELEASPOINT'
     175    allocate(xmass(numpoint,maxspec) &
     176         ,stat=stat)
     177    if (stat.ne.0) write(*,*)'ERROR: could not allocate RELEASPOINT'
     178    allocate(rho_rel(numpoint) &
     179         ,stat=stat)
     180    if (stat.ne.0) write(*,*)'ERROR: could not allocate RELEASPOINT'
     181    allocate(npart(numpoint) &
     182         ,stat=stat)
     183    if (stat.ne.0) write(*,*)'ERROR: could not allocate RELEASPOINT'
     184    allocate(xmasssave(numpoint) &
     185         ,stat=stat)
     186    if (stat.ne.0) write(*,*)'ERROR: could not allocate RELEASPOINT'
     187
     188   write (*,*) ' Releasepoints allocated: ', numpoint
     189
     190   do i=1,numpoint
     191     xmasssave(i)=0.
     192   end do
    265193
    266194  !now save the information
     
    273201  end do
    274202
    275   if (readerror.ne.0) then
    276     ! Skip first 11 lines (file header)
    277     !**********************************
    278 
    279     call skplin(11,unitreleases)
    280 
    281     ! Assign species-specific parameters needed for physical processes
    282     !*************************************************************************
    283 
    284     read(unitreleases,*,err=998) nspec
    285     if (nspec.gt.maxspec) goto 994
     203  rewind(unitreleases)
     204
     205
     206  ! Skip first 11 lines (file header)
     207  !**********************************
     208
     209  call skplin(11,unitreleases)
     210
     211
     212  ! Assign species-specific parameters needed for physical processes
     213  !*************************************************************************
     214
     215  read(unitreleases,*,err=998) nspec
     216  if (nspec.gt.maxspec) goto 994
     217  if (old) call skplin(2,unitreleases)
     218  do i=1,nspec
     219    read(unitreleases,*,err=998) specnum_rel
    286220    if (old) call skplin(2,unitreleases)
    287   endif
    288 
    289   ! namelist output
    290   if (nmlout.eqv..true.) then
    291     write(unitreleasesout,nml=releases_ctrl)
    292   endif
    293 
    294   do i=1,nspec
    295     if (readerror.ne.0) then
    296       read(unitreleases,*,err=998) specnum_rel(i)
    297       if (old) call skplin(2,unitreleases)
    298       call readspecies(specnum_rel(i),i)
    299     else
    300       call readspecies(specnum_rel(i),i)
    301     endif
    302 
    303     ! For backward runs, only 1 species is allowed
    304     !*********************************************
    305 
    306     !if ((ldirect.lt.0).and.(nspec.gt.1)) then
    307     !write(*,*) '#####################################################'
    308     !write(*,*) '#### FLEXPART MODEL SUBROUTINE READRELEASES:     ####'
    309     !write(*,*) '#### FOR BACKWARD RUNS, ONLY 1 SPECIES IS ALLOWED####'
    310     !write(*,*) '#####################################################'
    311     !  stop
    312     !endif
    313 
    314     ! Molecular weight
    315     !*****************
    316 
    317     if (((iout.eq.2).or.(iout.eq.3)).and.(weightmolar(i).lt.0.)) then
     221    call readspecies(specnum_rel,i)
     222
     223  ! For backward runs, only 1 species is allowed
     224  !*********************************************
     225
     226  !if ((ldirect.lt.0).and.(nspec.gt.1)) then
     227  !write(*,*) '#####################################################'
     228  !write(*,*) '#### FLEXPART MODEL SUBROUTINE READRELEASES:     ####'
     229  !write(*,*) '#### FOR BACKWARD RUNS, ONLY 1 SPECIES IS ALLOWED####'
     230  !write(*,*) '#####################################################'
     231  !  stop
     232  !endif
     233
     234  ! Molecular weight
     235  !*****************
     236
     237    if (((iout.eq.2).or.(iout.eq.3)).and. &
     238         (weightmolar(i).lt.0.)) then
    318239      write(*,*) 'For mixing ratio output, valid molar weight'
    319240      write(*,*) 'must be specified for all simulated species.'
     
    323244    endif
    324245
    325     ! Radioactive decay
    326     !******************
     246
     247  ! Radioactive decay
     248  !******************
    327249
    328250    decay(i)=0.693147/decay(i) !conversion half life to decay constant
    329251
    330252
    331     ! Dry deposition of gases
    332     !************************
    333 
    334     if (reldiff(i).gt.0.) rm(i)=1./(henry(i)/3000.+100.*f0(i))    ! mesophyll resistance
    335 
    336     ! Dry deposition of particles
    337     !****************************
     253  ! Dry deposition of gases
     254  !************************
     255
     256    if (reldiff(i).gt.0.) &
     257         rm(i)=1./(henry(i)/3000.+100.*f0(i))    ! mesophyll resistance
     258
     259  ! Dry deposition of particles
     260  !****************************
    338261
    339262    vsetaver(i)=0.
    340263    cunningham(i)=0.
    341264    dquer(i)=dquer(i)*1000000.         ! Conversion m to um
    342     if (density(i).gt.0.) then         ! Additional parameters
    343       call part0(dquer(i),dsigma(i),density(i),fracth,schmih,cun,vsh)
     265    if (density(i).gt.0.) then                  ! Additional parameters
     266     call part0(dquer(i),dsigma(i),density(i),fracth,schmih,cun,vsh)
    344267      do j=1,ni
    345268        fract(i,j)=fracth(j)
     
    349272        vsetaver(i)=vsetaver(i)-vset(i,j)*fract(i,j)
    350273      end do
    351       write(*,*) 'Average settling velocity: ',i,vsetaver(i)
    352     endif
    353 
    354     ! Dry deposition for constant deposition velocity
    355     !************************************************
     274      write(*,*) 'Average setting velocity: ',i,vsetaver(i)
     275    endif
     276
     277  ! Dry deposition for constant deposition velocity
     278  !************************************************
    356279
    357280    dryvel(i)=dryvel(i)*0.01         ! conversion to m/s
    358281
    359     ! Check if wet deposition or OH reaction shall be calculated
    360     !***********************************************************
     282  ! Check if wet deposition or OH reaction shall be calculated
     283  !***********************************************************
    361284    if (weta(i).gt.0.)  then
    362285      WETDEP=.true.
    363       write (*,*) 'Below-cloud scavenging: ON'
    364       write (*,*) 'Below-cloud scavenging coefficients: ',weta(i),i
    365     else
    366       write (*,*) 'Below-cloud scavenging: OFF'
    367     endif
    368    
    369     ! NIK 31.01.2013 + 10.12.2013
    370     if (weta_in(i).gt.0.)  then
    371       WETDEP=.true.
    372       write (*,*) 'In-cloud scavenging: ON'
    373       write (*,*) 'In-cloud scavenging coefficients: ',weta_in(i),wetb_in(i), wetc_in(i), wetd_in(i),i
    374     else
    375       write (*,*) 'In-cloud scavenging: OFF'
    376     endif
    377 
     286      write (*,*) 'Wetdeposition switched on: ',weta(i),i
     287    endif
    378288    if (ohreact(i).gt.0) then
    379289      OHREA=.true.
    380       write (*,*) 'OHreaction: ON (',ohreact(i),i,')'
    381     endif
    382 
    383     if ((reldiff(i).gt.0.).or.(density(i).gt.0.).or.(dryvel(i).gt.0.)) then
     290      write (*,*) 'OHreaction switched on: ',ohreact(i),i
     291    endif
     292
     293
     294    if ((reldiff(i).gt.0.).or.(density(i).gt.0.).or. &
     295         (dryvel(i).gt.0.)) then
    384296      DRYDEP=.true.
    385297      DRYDEPSPEC(i)=.true.
     
    388300  end do
    389301
    390   if (WETDEP.or.DRYDEP) DEP=.true.
     302    if (WETDEP.or.DRYDEP) DEP=.true.
    391303
    392304  ! Read specifications for each release point
    393305  !*******************************************
    394   numpoints=numpoint
     306
    395307  numpoint=0
    396308  numpartmax=0
    397309  releaserate=0.
    398 101   numpoint=numpoint+1
    399 
    400   if (readerror.lt.1) then ! reading namelist format
    401 
    402     if (numpoint.gt.numpoints) goto 250
    403     zkind = 1
    404     mass = 0
    405     parts = 0
    406     comment = ' '
    407     read(unitreleases,release,iostat=readerror)
    408     id1=idate1
    409     it1=itime1
    410     id2=idate2
    411     it2=itime2
    412     xpoint1(numpoint)=lon1
    413     xpoint2(numpoint)=lon2
    414     ypoint1(numpoint)=lat1
    415     ypoint2(numpoint)=lat2
    416     zpoint1(numpoint)=z1
    417     zpoint2(numpoint)=z2
    418     kindz(numpoint)=zkind
    419     do i=1,nspec
    420       xmass(numpoint,i)=mass(i)
    421     end do
    422     npart(numpoint)=parts
    423     compoint(min(1001,numpoint))=comment
    424 
    425     ! namelist output
    426     if (nmlout.eqv..true.) then
    427       write(unitreleasesout,nml=release)
    428     endif
    429 
     3101000   numpoint=numpoint+1
     311  read(unitreleases,*,end=250)
     312  read(unitreleases,*,err=998,end=250) id1,it1
     313  if (old) call skplin(2,unitreleases)
     314  read(unitreleases,*,err=998) id2,it2
     315  if (old) call skplin(2,unitreleases)
     316  read(unitreleases,*,err=998) xpoint1(numpoint)
     317  if (old) call skplin(2,unitreleases)
     318  read(unitreleases,*,err=998) ypoint1(numpoint)
     319  if (old) call skplin(2,unitreleases)
     320  read(unitreleases,*,err=998) xpoint2(numpoint)
     321  if (old) call skplin(2,unitreleases)
     322  read(unitreleases,*,err=998) ypoint2(numpoint)
     323  if (old) call skplin(2,unitreleases)
     324  read(unitreleases,*,err=998) kindz(numpoint)
     325  if (old) call skplin(2,unitreleases)
     326  read(unitreleases,*,err=998) zpoint1(numpoint)
     327  if (old) call skplin(2,unitreleases)
     328  read(unitreleases,*,err=998) zpoint2(numpoint)
     329  if (old) call skplin(2,unitreleases)
     330  read(unitreleases,*,err=998) npart(numpoint)
     331  if (old) call skplin(2,unitreleases)
     332  do i=1,nspec
     333    read(unitreleases,*,err=998) xmass(numpoint,i)
     334    if (old) call skplin(2,unitreleases)
     335  end do
     336  !save compoint only for the first 1000 release points
     337  if (numpoint.le.1000) then
     338    read(unitreleases,'(a40)',err=998) compoint(numpoint)(1:40)
    430339  else
    431 
    432     read(unitreleases,*,end=250)
    433     read(unitreleases,*,err=998,end=250) id1,it1
    434     if (old) call skplin(2,unitreleases)
    435     read(unitreleases,*,err=998) id2,it2
    436     if (old) call skplin(2,unitreleases)
    437     read(unitreleases,*,err=998) xpoint1(numpoint)
    438     if (old) call skplin(2,unitreleases)
    439     read(unitreleases,*,err=998) ypoint1(numpoint)
    440     if (old) call skplin(2,unitreleases)
    441     read(unitreleases,*,err=998) xpoint2(numpoint)
    442     if (old) call skplin(2,unitreleases)
    443     read(unitreleases,*,err=998) ypoint2(numpoint)
    444     if (old) call skplin(2,unitreleases)
    445     read(unitreleases,*,err=998) kindz(numpoint)
    446     if (old) call skplin(2,unitreleases)
    447     read(unitreleases,*,err=998) zpoint1(numpoint)
    448     if (old) call skplin(2,unitreleases)
    449     read(unitreleases,*,err=998) zpoint2(numpoint)
    450     if (old) call skplin(2,unitreleases)
    451     read(unitreleases,*,err=998) npart(numpoint)
    452     if (old) call skplin(2,unitreleases)
    453     do i=1,nspec
    454       read(unitreleases,*,err=998) xmass(numpoint,i)
    455       if (old) call skplin(2,unitreleases)
    456       mass(i)=xmass(numpoint,i)
    457     end do
    458     !save compoint only for the first 1000 release points
    459     if (numpoint.le.1000) then
    460       read(unitreleases,'(a40)',err=998) compoint(numpoint)(1:40)
    461       comment=compoint(numpoint)(1:40)
    462     else
    463       read(unitreleases,'(a40)',err=998) compoint(1001)(1:40)
    464       comment=compoint(1001)(1:40)
    465     endif
    466     if (old) call skplin(1,unitreleases)
    467 
    468     ! namelist output
    469     if (nmlout.eqv..true.) then
    470       idate1=id1
    471       itime1=it1
    472       idate2=id2
    473       itime2=it2
    474       lon1=xpoint1(numpoint)
    475       lon2=xpoint2(numpoint)
    476       lat1=ypoint1(numpoint)
    477       lat2=ypoint2(numpoint)
    478       z1=zpoint1(numpoint)
    479       z2=zpoint2(numpoint)
    480       zkind=kindz(numpoint)
    481       parts=npart(numpoint)
    482       write(unitreleasesout,nml=release)
    483     endif
    484 
    485     if (numpoint.le.1000) then
    486       if((xpoint1(numpoint).eq.0.).and.(ypoint1(numpoint).eq.0.).and. &
    487            (xpoint2(numpoint).eq.0.).and.(ypoint2(numpoint).eq.0.).and. &
    488            (compoint(numpoint)(1:8).eq.'        ')) goto 250
    489     else
    490       if((xpoint1(numpoint).eq.0.).and.(ypoint1(numpoint).eq.0.).and. &
    491            (xpoint2(numpoint).eq.0.).and.(ypoint2(numpoint).eq.0.)) goto 250
    492     endif
    493 
    494   endif ! if namelist format
     340    read(unitreleases,'(a40)',err=998) compoint(1001)(1:40)
     341  endif
     342  if (old) call skplin(1,unitreleases)
     343  if (numpoint.le.1000) then
     344    if((xpoint1(numpoint).eq.0.).and.(ypoint1(numpoint).eq.0.).and. &
     345         (xpoint2(numpoint).eq.0.).and.(ypoint2(numpoint).eq.0.).and. &
     346         (compoint(numpoint)(1:8).eq.'        ')) goto 250
     347  else
     348    if((xpoint1(numpoint).eq.0.).and.(ypoint1(numpoint).eq.0.).and. &
     349         (xpoint2(numpoint).eq.0.).and.(ypoint2(numpoint).eq.0.)) goto 250
     350  endif
     351
    495352
    496353  ! If a release point contains no particles, stop and issue error message
     
    563420  endif
    564421
     422
     423  ! Check, whether the total number of particles may exceed totally allowed
     424  ! number of particles at some time during the simulation
     425  !************************************************************************
     426
    565427  ! Determine the release rate (particles per second) and total number
    566428  ! of particles released during the simulation
     
    574436  endif
    575437  numpartmax=numpartmax+npart(numpoint)
    576   goto 101
     438  goto 1000
     439
    577440
    578441250   close(unitreleases)
    579442
    580   if (nmlout.eqv..true.) then
    581     close(unitreleasesout)
    582   endif
    583 
    584   write (*,*) 'Particles allocated (maxpart)  : ',maxpart
    585   write (*,*) 'Particles released (numpartmax): ',numpartmax
     443  write (*,*) ' Particles allocated for this run: ',maxpart, ', released in simulation: ',  numpartmax
    586444  numpoint=numpoint-1
    587445
     
    591449    maxpointspec_act=1
    592450  endif
    593 
    594   ! Check, whether the total number of particles may exceed totally allowed
    595   ! number of particles at some time during the simulation
    596   !************************************************************************
    597451
    598452  if (releaserate.gt. &
     
    652506  stop
    653507
    654 1000 write(*,*) ' #### FLEXPART MODEL ERROR! FILE "RELEASES"    #### '
    655   write(*,*) ' #### CANNOT BE OPENED IN THE DIRECTORY       #### '
    656   write(*,'(a)') path(2)(1:length(2))
    657   stop
    658 
    659508end subroutine readreleases
Note: See TracChangeset for help on using the changeset viewer.
hosted by ZAMG