New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
utils.F90 in NEMO/branches/UKMO/tools_r4.0-HEAD_dev_DMP_TOOLS/DMP_TOOLS/src – NEMO

source: NEMO/branches/UKMO/tools_r4.0-HEAD_dev_DMP_TOOLS/DMP_TOOLS/src/utils.F90 @ 15745

Last change on this file since 15745 was 15745, checked in by dbruciaferri, 2 years ago

modifications for restoring upper 300 m to EN4

File size: 5.5 KB
Line 
1MODULE utils
2
3  USE netcdf
4
5  IMPLICIT NONE
6  PUBLIC
7 
8  INTEGER, PUBLIC, PARAMETER   :: dp=8 , sp=4, wp=dp
9  INTEGER :: tmask_id, umask_id, vmask_id, fmask_id
10  INTEGER :: gdept_id
11  INTEGER :: gphit_id, gphiv_id, gphiu_id, gphif_id        ! Variable ids
12  INTEGER :: glamt_id, glamv_id, glamu_id, glamf_id        ! Variable ids
13  INTEGER :: resto_id                           ! Variable ID for output
14  INTEGER :: jpi, jpj, jpk                      ! Size of domain
15  INTEGER  :: ncin, ncout                              ! File handles for netCDF files
16  REAL(wp), DIMENSION(:,:),   ALLOCATABLE :: gphit, glamt
17  REAL(wp), DIMENSION(:,:),   ALLOCATABLE :: gphiu, glamu
18  REAL(wp), DIMENSION(:,:),   ALLOCATABLE :: gphiv, glamv
19  REAL(wp), DIMENSION(:,:),   ALLOCATABLE :: gphif, glamf
20  REAL(wp), DIMENSION(:,:),   ALLOCATABLE :: tmask, umask, vmask, fmask
21  REAL(wp), DIMENSION(:,:),   ALLOCATABLE :: dcst
22  REAL(wp), DIMENSION(:,:),   ALLOCATABLE :: gdept
23  REAL(wp), DIMENSION(:,:),   ALLOCATABLE :: resto
24
25  INTEGER,PARAMETER :: numout = 6
26  INTEGER,PARAMETER :: numerr = 0
27  INTEGER,PARAMETER :: numnam = 11
28  REAL(wp),PARAMETER :: rday = 86400           ! seconds in a day
29  REAL(wp),PARAMETER ::   rpi = 3.141592653589793
30  REAL(wp),PARAMETER ::   rad = 3.141592653589793/180.
31  REAL(wp),PARAMETER ::   ra =  6371229.
32
33  ! Namelist variables
34  CHARACTER(LEN=30) :: cp_cfg = 'ORCA'
35  CHARACTER(LEN=30) :: cp_cfz = 'No zoom'
36  INTEGER :: jp_cfg = 2
37  REAL(KIND=8) :: pn_surf = 1
38  REAL(KIND=8) :: pn_bot = 1
39  REAL(KIND=8) :: pn_dep = 1000         
40  REAL(KIND=8) :: pn_cst = 1000
41  REAL(KIND=8) :: rn_k = 50
42  INTEGER  :: nn_hdmp = 0                          ! damping option
43  INTEGER  :: jperio = 0                          ! damping option
44  LOGICAL :: lzoom = .false.
45  LOGICAL :: ln_coast = .false.
46  LOGICAL :: ln_full_field = .true.
47  LOGICAL :: ln_med_red_seas = .false.
48  LOGICAL :: ln_old_31_lev_code = .false.
49  LOGICAL :: ln_zero_top_layer = .false.
50  LOGICAL :: ln_custom = .false.
51  LOGICAL :: ln_exp = .true.
52
53  NAMELIST/nam_dmp_create/cp_cfg, cp_cfz, jp_cfg, lzoom, ln_full_field,  &
54                          ln_med_red_seas, ln_old_31_lev_code, ln_coast, &
55                          ln_zero_top_layer, ln_custom, ln_exp,          &
56                          pn_surf, pn_bot, pn_dep, rn_k, pn_cst, nn_hdmp, jperio
57
58  CONTAINS
59
60  SUBROUTINE grid_info(mesh)
61     CHARACTER(LEN=*),INTENT(in) :: mesh
62
63     ! Open meshfile
64     CALL check_nf90( nf90_open(mesh, NF90_NOWRITE, ncin), 'Error opening mesh_mask file' )
65 
66     ! Get size of grid from meshfile
67     CALL dimlen( ncin, 'x', jpi )
68     CALL dimlen( ncin, 'y', jpj )
69     CALL dimlen( ncin, 'z', jpk )
70
71     ALLOCATE( tmask(jpi, jpj), gdept(jpi, jpj), gphit(jpi,jpj) )
72
73     !Get ID of tmask in meshfile
74     CALL check_nf90( nf90_inq_varid( ncin, 'tmask', tmask_id ), 'Cannot get variable ID for tmask')
75     CALL check_nf90( nf90_inq_varid( ncin, 'umask', umask_id ), 'Cannot get variable ID for umask')
76     CALL check_nf90( nf90_inq_varid( ncin, 'vmask', vmask_id ), 'Cannot get variable ID for vmask')
77     CALL check_nf90( nf90_inq_varid( ncin, 'fmask', fmask_id ), 'Cannot get variable ID for fmask')
78     CALL check_nf90( nf90_inq_varid( ncin, 'gdept_0', gdept_id ), 'Cannot get variable ID for gdept_0')
79     CALL check_nf90( nf90_inq_varid( ncin, 'gphit', gphit_id ), 'Cannot get variable ID for gphit')
80     CALL check_nf90( nf90_inq_varid( ncin, 'gphiu', gphiu_id ), 'Cannot get variable ID for gphiu')
81     CALL check_nf90( nf90_inq_varid( ncin, 'gphiv', gphiv_id ), 'Cannot get variable ID for gphiv')
82     CALL check_nf90( nf90_inq_varid( ncin, 'gphif', gphif_id ), 'Cannot get variable ID for gphif')
83     CALL check_nf90( nf90_inq_varid( ncin, 'glamt', glamt_id ), 'Cannot get variable ID for glamt')
84     CALL check_nf90( nf90_inq_varid( ncin, 'glamu', glamu_id ), 'Cannot get variable ID for glamu')
85     CALL check_nf90( nf90_inq_varid( ncin, 'glamv', glamv_id ), 'Cannot get variable ID for glamv')
86     CALL check_nf90( nf90_inq_varid( ncin, 'glamf', glamf_id ), 'Cannot get variable ID for glamf')
87 
88  END SUBROUTINE grid_info
89
90  SUBROUTINE dimlen( ncid, dimname, len )
91     ! Determine the length of dimension dimname
92     INTEGER, INTENT(in)          :: ncid
93     CHARACTER(LEN=*), INTENT(in) :: dimname
94     INTEGER, INTENT(out)         :: len
95     ! Local variables
96     INTEGER :: id_var, istatus
97
98     id_var = 1
99     CALL check_nf90( nf90_inq_dimid(ncid, dimname, id_var), 'Dimension not found in file')
100     CALL check_nf90( nf90_inquire_dimension(ncid,id_var,len=len))
101
102  END SUBROUTINE dimlen
103
104  SUBROUTINE make_outfile( filename )
105     ! Create the output file
106     ! Define dimensions and resto variable
107     CHARACTER(LEN=*), INTENT(in) :: filename
108     INTEGER :: id_x, id_y, id_z
109
110     CALL check_nf90( nf90_create(filename, NF90_CLOBBER, ncout), 'Could not create output file')
111     CALL check_nf90( nf90_def_dim(ncout, 'x', jpi, id_x) )
112     CALL check_nf90( nf90_def_dim(ncout, 'y', jpj, id_y) )
113     CALL check_nf90( nf90_def_dim(ncout, 'z', jpk, id_z) )
114
115     CALL check_nf90( nf90_def_var(ncout, 'resto', nf90_double, (/id_x,id_y,id_z/), resto_id ) )
116     CALL check_nf90( nf90_enddef(ncout) )
117
118  END SUBROUTINE make_outfile
119
120
121  SUBROUTINE check_nf90( istat, message )
122     !Check for netcdf errors
123     INTEGER, INTENT(in) :: istat
124     CHARACTER(LEN=*), INTENT(in), OPTIONAL :: message
125     
126     IF (istat /= nf90_noerr) THEN
127        WRITE(numerr,*) 'ERROR! : '//TRIM(nf90_strerror(istat))
128        IF ( PRESENT(message) ) THEN ; WRITE(numerr,*) message ; ENDIF
129        STOP
130     ENDIF
131
132  END SUBROUTINE check_nf90
133
134END MODULE utils
Note: See TracBrowser for help on using the repository browser.