123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- !KAL -- this module allows us to fine-tune the fields
- !KAL -- we wish to include in the analysis. The new
- !KAL -- layout of the EnKF makes it possible to specify fields
- !KAL -- to analyze at run-time rather than at compile-time
- !KAL -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- !KAL --
- !KAL -- Module variables:
- !KAL -- numfields - total number of fields to process
- !KAL -- fieldnames - the names of the fields we wish to analyze
- !KAL -- fieldlevel - the levels of the associated fields
- !KAL -- fieldtype - in which file the field can be found:
- !ckb -- 1: ice, 2: ocean, 3: ice parameter,
- !ckb -- 4: ocean parameter
- !KAL --
- !KAL -- Ex: If we only want to assimilate temperatures in layer
- !KAL -- one and two, numfields, fieldnames and fieldlevel
- !KAL -- would look like:
- !KAL --
- !KAL -- numfields=2
- !KAL -- fieldnames (1)='temp', fieldnames (2)='temp'
- !KAL -- fieldlevel (1)= 1, fieldlevel (2)=2 (???)
- !ckb -- fieldtype (1)= 2, fieldtype (2)=2
- !KAL -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- !KAL -- The file "analysisfields.in" specifies the fields to
- !KAL -- inlude in the analysis. Format of one line is fieldname
- !ckb -- first layer, last layer and fieldtype. For example:
- !KAL --
- !KAL -- fieldname 1 31 1
- !KAL -- 12345678901234567890123456789012345678901234567890
- !KAL --
- !KAL -- Fortran format for one line is '(a14,3i3)'
- !KAL --
- !KAL -- Example: to specify that we want temperature and salinity
- !ckb -- in layers 1-31 (ocean variables, type 2) to be
- !ckb -- updated, as well as ice concentration (layer 0,
- !ckb -- type 1), and the atmosphere-ice-drag coefficient,
- !ckb -- specify:
- !ckb --
- !ckb -- a_i_htc1 0 0 1
- !ckb -- v_i_htc1 0 0 1
- !ckb -- tempt_il3_htc5 0 0 1
- !ckb -- ub 1 31 2
- !ckb -- vb 1 31 2
- !ckb -- cai 0 0 3
- !KAL -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- ! [FM,CKB] Changed to allow for column "parameter"
- module mod_analysisfields
- character(len=*), parameter :: infile='analysisfields.in'
- integer,save :: numfields
- character(len=14), dimension(:), save, allocatable:: fieldnames
- integer , dimension(:), save, allocatable:: fieldlevel
- integer , dimension(:), save, allocatable:: fieldtype
- contains
- integer function get_nrfields()
- #if defined (QMPI)
- use qmpi
- #else
- use qmpi_fake
- #endif
- implicit none
- integer :: ios,first,last,type
- logical :: ex
- character(len=14) :: char14
- inquire(exist=ex,file=infile)
- if (.not. ex) then
- if (master) print *,'Could not find '//infile
- call stop_mpi()
- end if
- open(10,status='old',form='formatted',file=infile)
- ios=0
- get_nrfields=0
- do while (ios==0)
- read(10,100,iostat=ios) char14,first,last,type
- if (ios==0) get_nrfields=get_nrfields+last-first+1
- end do
- close(10)
- 100 format (a14,3i3)
- end function
- subroutine get_analysisfields()
- #if defined (QMPI)
- use qmpi
- #else
- use qmpi_fake
- #endif
- implicit none
- integer :: first,last,type,k,nfld,ios
- logical :: ex
- character(len=14) :: char14
- numfields=get_nrfields()
- if (master) print *,'numfields is ',numfields
- if (numfields<=0 .or.numfields > 18000) then ! FM I Changed 600 to 18000
- if (master) print *,'(get_analysisfields) numfields is higher than max allowed setting or = 0'
- call stop_mpi()
- end if
- allocate(fieldnames(numfields))
- allocate(fieldlevel(numfields))
- allocate(fieldtype(numfields))
- inquire(exist=ex,file=infile)
- if (.not. ex) then
- if (master) print *,'Could not find '//infile
- call stop_mpi()
- end if
- open(10,status='old',form='formatted',file=infile)
- ios=0
- nfld=0
- do while (ios==0)
- read(10,100,iostat=ios) char14,first,last,type
- if (ios==0) then
- do k=first,last
- fieldnames (nfld+k-first+1)=char14
- fieldlevel (nfld+k-first+1)=k
- fieldtype (nfld+k-first+1)=type
- end do
- nfld=nfld+last-first+1
- end if
- end do
- close(10)
- 100 format (a14,3i3)
- if (nfld/=numfields) then
- if (master) print *,'An error occured when reading '//infile
- call stop_mpi()
- end if
- ! List fields used in analysis
- print *, "(mod_analysisfields) Fields used in analysis:"
- print *, "(mod_analysisfields) --- removed to reduce output ---"
- !do k=1,numfields
- ! if (master) print *,fieldnames(k),fieldlevel(k),fieldtype(k)
- !end do
- end subroutine
- end module mod_analysisfields
|