Reading netCDF4 file in MY_TRC
¶
This section describes the ways to read an user-defined nerCDF4 file during the time stepping of MY_TRC
in NEMO 3.4.
Through NEMO’s existing file channel¶
By replacing the variable information in namelist/&namdta_dyn
to your own, the tracer model can read your files during the simulation.
An example of it can be found in here.
(this section needs more explainations)
By creating a new namelist¶
Note
The examples here and below are requiring a netCDF4 file in EXP00
which contains nav_lat, nav_lon, time_counter and var_name.
The netCDF4 file should have the same longtitude/latitude dimensions as the file coordinate.nc
in your case. The time dimension should be
“UNLIMITED” and var_name is the variable you want MY_TRC
to read.
The arrangment of the dimensions (For Python users) should be (TIME, LAT, LON).
Create namelist_my_trc
¶
In $your_case/EXP00/
, create the file namelist_my_trc
:
&namelist_section
!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
! ! file name ! frequency (hours) ! variable ! time interp. ! clim ! 'yearly'/ ! weights ! rotation !
! ! ! (if <0 months) ! name ! (logical) ! (T/F) ! 'monthly' ! filename ! pairing !
sn_var ='file_name', -12 ,'var_name', .false. , .true. , 'yearly' , '' , ''
cn_dir = './'
/
- frequency is the reading frequency of the variable in time dimension
- clim is the flag of file batching ...
- A section should be ended with
/
Edit MY_TRC
scripts¶
The structure and access information can be added in trcini_my_trc.F90
and trcnam_my_trc.F90
. When the variable is read,
it can be used in trcsms_my_trc.F90
.
In trcini_my_trc.F90
, assign the structure of your file by fld_fill(...)
.
IMPLICIT NONE
PRIVATE
PUBLIC trc_ini_my_trc ! called by trcini.F90 module
CONTAINS
SUBROUTINE trc_ini_my_trc
IF(trc_sms_my_trc_alloc() /= 0) THEN
CALL ctl_stop('STOP', 'trc_ini_my_trc: unable to allocate MY_TRC arrays')
! Assign structure
CALL fld_fill(sf_var, (/sn_var/), cn_dir, 'trc_ini_my_trc', 'docs', 'namelist_section')
END SUBROUTINE trc_ini_my_trc
In trcnam_my_trc.F90
, read the variable through ctl_opn(...)
. The name of the namelist "namelist_my_trc"
should be consistent with the one created in the section above.
IMPLICIT NONE
PRIVATE
PUBLIC trc_nam_my_trc ! called by trcnam.F90 module
CONTAINS
SUBROUTINE trc_nam_my_trc
INTEGER :: numnatl
NAMELIST/namelist_section/ cn_dir, sn_var
CALL ctl_opn(numnatl, 'namelist_my_trc', 'OLD', 'FORMATTED', 'SEQUENTIAL', 1, numout, .FALSE.)
REWIND(numnatl)
READ (numnatl, namelist_section)
END SUBROUTINE trc_nam_my_trc
trcsms_my_trc.F90
call the two scripts above and allocates the array.
IMPLICIT NONE
PUBLIC
PUBLIC trc_sms_my_trc ! called by trcsms.F90 module
PUBLIC trc_sms_my_trc_alloc ! called by trcini_my_trc.F90 module
CHARACTER(len=100), PUBLIC :: cn_dir = './' ! Root directorY
TYPE(FLD_N) :: sn_var ! information about the file to be read
REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: var ! Array receives the value from netCDF
TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_var ! structure variable (PUBLIC for TAM)
CONTAINS
SUBROUTINE trc_sms_my_trc( kt )
INTEGER, INTENT(in) :: kt ! ocean e-step index
INTEGER :: i, j
IF(nn_timing == 1) CALL timing_start('trc_sms_my_trc')
!
CALL fld_read (kt, 1, sf_var)
var(:, :) = sf_var(1)%fnow(:, :, 1)
! More code ...
END SUBROUTINE trc_sms_my_trc
INTEGER FUNCTION trc_sms_my_trc_alloc()
INTEGER :: ierror
ALLOCATE(var(jpi,jpj), STAT=trc_sms_my_trc_alloc)
ALLOCATE(sf_var(1), STAT=ierror)
IF(ierror > 0) THEN
CALL ctl_stop('trc_sms_my_trc_alloc: unable to allocate');
RETURN
ENDIF
ALLOCATE(sf_var(1)%fnow(jpi, jpj, 1))
IF(trc_sms_my_trc_alloc /= 0) THEN
CALL ctl_warn('trc_sms_my_trc_alloc : failed to allocat')
END FUNCTION trc_sms_my_trc_alloc
For 4 dimension variables (time dimension has been subtrackted by keyword “frequency” in the namelist): var(:, :, :) = sf_var(1)%fnow(:, :, :).