module ozinfo !$$$ module documentation block ! . . . . ! module: ozinfo ! prgmmr: treadon org: np23 date: 2004-04-10 ! ! abstract: This module contains variables and routines related ! to the assimilation of ozone observations (presently, ! satellite based ozone observations) ! ! program history log: ! 2004-04-10 treadon - original code ! 2004-05-13 kleist - original documentation ! 2004-06-16 treadon - update documentation ! 2004-12-22 treadon - rename logical "idiag_ozone" to "diag_ozone" ! 2005-09-28 derber - Modify for new ozinfo file, add var qc parameters ! 2006-02-03 derber - modify for new obs control and obs count ! 2007-06-29 Zhou - change total number of ozone enteries (jpch_oz) from ! 53 (version 6 SBUV/2) to 67 (version 8 SBUV/2) ! ! Subroutines Included: ! sub init_oz - set ozone related variables to defaults ! sub ozinfo_read - read in ozone info ! ! Functions Included: ! ! Variable Definitions: ! def diag_ozone - logical to turn off or on the diagnostic ozone file (true=on) ! def jpch_oz - number of (levels+1) * number of satellites ! def mype_oz - task id for writing out radiance diagnostics ! def pob_oz - pressure level of observation (hPa) ! def gross_oz - gross error limit ! def error_oz - observation error ! def nusis_oz - sensor/intrument/satellite id (14=NOAA-14, 15=NOAA-15, 16=NOAA-16, etc) ! def nulev - integer level of ozone observation ! def iuse_oz - integer flag to control usage of ozone data (-1=don't use, 1=use) ! ! attributes: ! language: f90 ! machine: ibm RS/6000 SP ! !$$$ end documentation block use kinds, only: r_kind,i_kind implicit none ! set default to private private ! set subroutines to public public :: init_oz public :: ozinfo_read ! set passed variables to pubic public :: jpch_oz,diag_ozone,nusis_oz,iuse_oz,b_oz,pg_oz,gross_oz public :: error_oz,pob_oz,mype_oz,nulev public :: ihave_oz logical diag_ozone integer(i_kind) mype_oz,jpch_oz real(r_kind),allocatable,dimension(:)::pob_oz,gross_oz,error_oz,pg_oz,b_oz integer(i_kind),allocatable,dimension(:):: nulev,iuse_oz character(len=20),allocatable,dimension(:):: nusis_oz logical :: ihave_oz contains subroutine init_oz !$$$ subprogram documentation block ! . . . . ! subprogram: init_oz initialize parameters for ozone data ! prgmmr: treadon org: np23 date: 2004-04-10 ! ! abstract: This routine sets default values for variables used in ! the ozone processing routines ! ! program history log: ! 2004-04-10 treadon ! 2004-06-16 treadon, documentation ! 2005-07-28 treadon - increase jpch_oz from 52 to 53 (add omi data) ! 2010-05-29 todling - check existence in state vector (viz., guess) ! ! input argument list: ! ! output argument list: ! ! attributes: ! language: f90 ! machine: ibm rs/6000 sp ! !$$$ use mpimod, only: npe ! contains the number of mpi tasks, variable "npe" use state_vectors, only: svars3d use mpeu_util, only: getindex implicit none jpch_oz = 0 ! number of enteries read from ozinfo diag_ozone = .true. ! default is to generate ozone diagnostic file mype_oz = max(0,npe-6) ! mpi task to write ozone summary report ihave_oz=(getindex(svars3d,'oz')>0)! .t. when OZ present in state-vector end subroutine init_oz subroutine ozinfo_read !$$$ subprogram documentation block ! . . . . ! subprogram: ozinfo_read read ozone information file ! prgmmr: treadon org: np23 date: 2004-04-10 ! ! abstract: This routine reads the ozone information file, global_ozinfo.txt ! ! program history log: ! 2004-04-10 treadon ! 2004-06-16 treadon, documentation ! 2005-10-11 treadon - change ozinfo read to free format ! 2008-04-29 safford - rm redundant use ! 2010-05-29 todling - update interface ! ! input argument list: ! ! output argument list: ! ! attributes: ! language: f90 ! machine: ibm rs/6000 sp ! !$$$ use mpimod, only: mype use obsmod, only: iout_oz implicit none character(len=1):: cflg character(len=120) crecord integer(i_kind) lunin,j,k,istat,nlines data lunin / 47 / ! Determine number of entries in ozone information file open(lunin,file='ozinfo',form='formatted') j=0 nlines=0 read1: do read(lunin,100,iostat=istat,end=123) cflg,crecord if (istat /= 0) exit nlines=nlines+1 if (cflg == '!') cycle j=j+1 end do read1 123 continue if (istat>0) then write(6,*)'OZINFO_READ: ***ERROR*** error reading ozinfo, istat=',istat close(lunin) write(6,*)'OZINFO_READ: stop program execution' call stop2(79) endif jpch_oz = j if(jpch_oz == 0)then close(lunin) return end if ! Allocate arrays to hold ozone information allocate(nusis_oz(jpch_oz),nulev(jpch_oz),iuse_oz(jpch_oz), & pob_oz(jpch_oz),gross_oz(jpch_oz),error_oz(jpch_oz), & pg_oz(jpch_oz),b_oz(jpch_oz)) ! All mpi tasks open and read ozone information file. ! Task mype_oz writes information to ozone runtime file if (mype==mype_oz) then open(iout_oz) write(iout_oz,110) jpch_oz 110 format('OZINFO_READ: jpch_oz=',1x,i6) endif rewind(lunin) j=0 do k=1,nlines read(lunin,100) cflg,crecord if (cflg == '!') cycle j=j+1 read(crecord,*) nusis_oz(j),& nulev(j),iuse_oz(j),pob_oz(j),gross_oz(j),error_oz(j), & b_oz(j),pg_oz(j) if (mype==mype_oz) write(iout_oz,130) j,nusis_oz(j),nulev(j),& iuse_oz(j),pob_oz(j),gross_oz(j),error_oz(j),b_oz(j), & pg_oz(j) end do close(lunin) if (mype==mype_oz) close(iout_oz) 100 format(a1,a120) 130 format(i3,1x,a20,' lev = ',i4,' use = ',i2,' pob = ',f9.3,& ' gross = ',f7.3,' error = ',f7.3,' b_oz = ',f7.3,' pg_oz = ',f7.3) ! Successful read, return to calling routine return end subroutine ozinfo_read end module ozinfo