source: trunk/LMDZ.GENERIC/libf/phystd/setspv.F90 @ 848

Last change on this file since 848 was 789, checked in by aslmd, 12 years ago

LMDZ.GENERIC
A more robust way to count lines in setspi and setspv.
bandlen.txt file is no longer used. This was causing problems with MPI computations.

File size: 4.4 KB
Line 
1      subroutine setspv
2
3!==================================================================
4!     
5!     Purpose
6!     -------
7!     Set up spectral intervals, stellar spectrum and Rayleigh
8!     opacity in the shortwave.
9!     
10!     Authors
11!     -------
12!     Adapted from setspv in the NASA Ames radiative code by
13!     Robin Wordsworth (2009).
14!
15!     Called by
16!     ---------
17!     callcorrk.F
18!     
19!     Calls
20!     -----
21!     ave_stelspec.F
22!     
23!==================================================================
24
25      use radinc_h,    only: L_NSPECTV, corrkdir, banddir
26      use radcommon_h, only: BWNV,BLAMV,WNOV,DWNV,WAVEV, &
27                             STELLARF,TAURAY
28      use datafile_mod, only: datadir
29
30      implicit none
31
32#include "comcstfi.h"
33#include "callkeys.h"
34
35      logical file_ok
36
37      integer N, M, file_entries
38
39      character(len=30)  :: temp1
40      character(len=200) :: file_id
41      character(len=200) :: file_path
42
43      real*8 :: lastband(2)
44
45      real*8 STELLAR(L_NSPECTV)
46      real*8 sum
47
48      !! used to count lines
49      integer :: nb=-1  !because first line is not an actual value
50      integer :: ierr=0
51
52!=======================================================================
53!     Set up spectral bands - wavenumber [cm^(-1)]. Go from smaller to
54!     larger wavenumbers, the same as in the IR.
55
56      write(temp1,'(i2.2)') L_NSPECTV
57      file_id='/corrk_data/'//trim(adjustl(banddir))//'/narrowbands_VI.in'
58      file_path=TRIM(datadir)//TRIM(file_id)
59
60      ! check that the file exists
61      inquire(FILE=file_path,EXIST=file_ok)
62      if(.not.file_ok) then
63         write(*,*)'The file ',TRIM(file_path)
64         write(*,*)'was not found by setspv.F90, exiting.'
65         write(*,*)'Check that your path to datagcm:',trim(datadir)
66         write(*,*)' is correct. You can change it in callphys.def with:'
67         write(*,*)' datadir = /absolute/path/to/datagcm'
68         write(*,*)'Also check that the corrkdir you chose in callphys.def exists.'
69         call abort
70      endif
71   
72      ! check that the file contains the right number of bands
73      open(131,file=file_path,form='formatted')
74      do while (ierr==0)
75        read(131,*,iostat=ierr) file_entries
76        if (ierr==0) nb=nb+1
77      enddo
78      close(131)
79      write(*,*) 'setspv: L_NSPECTV = ',L_NSPECTV, 'in the model '
80      write(*,*) '        there are   ',nb, 'entries in ',TRIM(file_path)
81      if(nb.ne.L_NSPECTV) then
82         write(*,*) 'MISMATCH !! I stop here'
83         call abort
84      endif
85
86      ! load and display the data
87      open(111,file=file_path,form='formatted')
88      read(111,*)
89       do M=1,L_NSPECTV-1
90         read(111,*) BWNV(M)
91      end do
92      read(111,*) lastband
93      close(111)
94      BWNV(L_NSPECTV)  =lastband(1)
95      BWNV(L_NSPECTV+1)=lastband(2)
96
97
98      print*,'setspv: VI band limits:'
99      do M=1,L_NSPECTV+1
100         print*,m,'-->',BWNV(M),' cm^-1'
101      end do
102      print*,' '
103
104!     Set up mean wavenumbers and wavenumber deltas.  Units of
105!     wavenumbers is cm^(-1); units of wavelengths is microns.
106
107      do M=1,L_NSPECTV
108         WNOV(M)  = 0.5*(BWNV(M+1)+BWNV(M))
109         DWNV(M)  = BWNV(M+1)-BWNV(M)
110         WAVEV(M) = 1.0E+4/WNOV(M)
111         BLAMV(M) = 0.01/BWNV(M)
112      end do
113      BLAMV(M) = 0.01/BWNV(M) ! wavelength in METERS for aerosol stuff
114!     note M=L_NSPECTV+1 after loop due to Fortran bizarreness
115
116!=======================================================================
117!     Set up stellar spectrum
118
119      write(*,*)'setspv: Interpolating stellar spectrum from the hires data...'
120      call ave_stelspec(STELLAR)
121
122!     Sum the stellar flux, and write out the result. 
123      sum = 0.0 
124      do N=1,L_NSPECTV
125         STELLARF(N) = STELLAR(N) * Fat1AU
126         sum         = sum+STELLARF(N)
127      end do
128      write(6,'("setspv: Stellar flux at 1 AU = ",f7.2," W m-2")') sum
129      print*,' '
130
131
132!=======================================================================
133!     Set up the wavelength independent part of the Rayleigh scattering.
134!     The pressure dependent part will be computed elsewhere (OPTCV).
135!     WAVEV is in microns.  There is no Rayleigh scattering in the IR.
136
137      if(rayleigh) then
138         call calc_rayleigh
139      else
140         print*,'setspv: No Rayleigh scattering, check for NaN in output!'
141         do N=1,L_NSPECTV
142            TAURAY(N) = 1E-16
143         end do
144      endif
145
146      RETURN
147    END subroutine setspv
Note: See TracBrowser for help on using the repository browser.