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

Last change on this file since 832 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
RevLine 
[135]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, &
[484]27                             STELLARF,TAURAY
[374]28      use datafile_mod, only: datadir
[135]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
[716]40      character(len=200) :: file_id
41      character(len=200) :: file_path
[135]42
43      real*8 :: lastband(2)
44
45      real*8 STELLAR(L_NSPECTV)
46      real*8 sum
47
[789]48      !! used to count lines
49      integer :: nb=-1  !because first line is not an actual value
50      integer :: ierr=0
51
[135]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'
[374]58      file_path=TRIM(datadir)//TRIM(file_id)
[135]59
60      ! check that the file exists
61      inquire(FILE=file_path,EXIST=file_ok)
62      if(.not.file_ok) then
[374]63         write(*,*)'The file ',TRIM(file_path)
[135]64         write(*,*)'was not found by setspv.F90, exiting.'
[374]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.'
[135]69         call abort
70      endif
[789]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
[135]78      close(131)
[789]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'
[135]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
[374]98      print*,'setspv: VI band limits:'
[135]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
[374]119      write(*,*)'setspv: Interpolating stellar spectrum from the hires data...'
[253]120      call ave_stelspec(STELLAR)
[135]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
[374]128      write(6,'("setspv: Stellar flux at 1 AU = ",f7.2," W m-2")') sum
[135]129      print*,' '
130
[253]131
[135]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
[374]140         print*,'setspv: No Rayleigh scattering, check for NaN in output!'
[135]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.