[3614] | 1 | MODULE icbtrj |
---|
| 2 | |
---|
| 3 | !!====================================================================== |
---|
| 4 | !! *** MODULE icbtrj *** |
---|
| 5 | !! Ocean physics: trajectory I/O routines |
---|
| 6 | !!====================================================================== |
---|
| 7 | !! History : 3.3.1 ! 2010-01 (Martin&Adcroft) Original code |
---|
| 8 | !! - ! 2011-03 (Madec) Part conversion to NEMO form |
---|
| 9 | !! - ! Removal of mapping from another grid |
---|
| 10 | !! - ! 2011-05 (Alderson) New module to handle trajectory output |
---|
| 11 | !!---------------------------------------------------------------------- |
---|
| 12 | !!---------------------------------------------------------------------- |
---|
| 13 | !! icb_trj_init : |
---|
| 14 | !!---------------------------------------------------------------------- |
---|
| 15 | USE par_oce ! NEMO parameters |
---|
| 16 | USE dom_oce ! NEMO ocean domain |
---|
| 17 | USE phycst ! NEMO physical constants |
---|
| 18 | USE lib_mpp ! NEMO MPI library, lk_mpp in particular |
---|
| 19 | USE in_out_manager ! NEMO IO, numout in particular |
---|
| 20 | USE netcdf |
---|
| 21 | ! |
---|
| 22 | USE icb_oce ! define iceberg arrays |
---|
| 23 | USE icbutl ! iceberg utility routines |
---|
| 24 | |
---|
| 25 | IMPLICIT NONE |
---|
| 26 | PRIVATE |
---|
| 27 | |
---|
| 28 | PUBLIC icb_trj_init ! routine called in icbini.F90 module |
---|
| 29 | PUBLIC icb_trj_write ! routine called in icbstp.F90 module |
---|
| 30 | PUBLIC icb_trj_sync ! routine called in icbstp.F90 module |
---|
| 31 | PUBLIC icb_trj_end ! routine called in icbstp.F90 module |
---|
| 32 | |
---|
| 33 | INTEGER :: num_traj |
---|
| 34 | INTEGER :: n_dim, m_dim |
---|
| 35 | INTEGER :: ntrajid |
---|
| 36 | INTEGER :: numberid, nstepid, nscaling_id |
---|
| 37 | INTEGER :: nlonid, nlatid, nxid, nyid, nuvelid, nvvelid, nmassid |
---|
| 38 | INTEGER :: nuoid, nvoid, nuaid, nvaid, nuiid, nviid |
---|
| 39 | INTEGER :: nsshxid, nsshyid, nsstid, ncntid, nthkid |
---|
| 40 | INTEGER :: nthicknessid, nwidthid, nlengthid |
---|
| 41 | INTEGER :: nyearid, ndayid |
---|
| 42 | INTEGER :: nmass_of_bits_id, nheat_density_id |
---|
| 43 | |
---|
| 44 | !!---------------------------------------------------------------------- |
---|
| 45 | !! NEMO/OPA 3.3 , NEMO Consortium (2011) |
---|
[5215] | 46 | !! $Id$ |
---|
[3614] | 47 | !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) |
---|
| 48 | !!---------------------------------------------------------------------- |
---|
| 49 | CONTAINS |
---|
| 50 | |
---|
| 51 | !!------------------------------------------------------------------------- |
---|
| 52 | |
---|
| 53 | SUBROUTINE icb_trj_init( ktend ) |
---|
| 54 | !!---------------------------------------------------------------------- |
---|
| 55 | !! *** ROUTINE icb_trj_init *** |
---|
| 56 | !! |
---|
| 57 | !! ** Purpose : initialise iceberg trajectory output files |
---|
| 58 | !!---------------------------------------------------------------------- |
---|
| 59 | INTEGER, INTENT( in ) :: ktend |
---|
| 60 | ! |
---|
| 61 | INTEGER :: iret |
---|
| 62 | CHARACTER(len=80) :: cl_filename |
---|
| 63 | TYPE(iceberg), POINTER :: this |
---|
| 64 | TYPE(point) , POINTER :: pt |
---|
| 65 | !!---------------------------------------------------------------------- |
---|
| 66 | |
---|
| 67 | IF( lk_mpp ) THEN ; WRITE(cl_filename,'("trajectory_icebergs_",I6.6,"_",I4.4,".nc")') ktend, narea-1 |
---|
| 68 | ELSE ; WRITE(cl_filename,'("trajectory_icebergs_",I6.6 ,".nc")') ktend |
---|
| 69 | ENDIF |
---|
| 70 | IF ( lwp .AND. nn_verbose_level >= 0) WRITE(numout,'(2a)') 'icebergs, icb_trj_init: creating ',TRIM(cl_filename) |
---|
| 71 | |
---|
| 72 | iret = NF90_CREATE(TRIM(cl_filename), NF90_CLOBBER, ntrajid) |
---|
| 73 | IF (iret .NE. NF90_NOERR) CALL ctl_stop('icebergs, icb_trj_init: nf_create failed') |
---|
| 74 | |
---|
| 75 | ! Dimensions |
---|
| 76 | iret = NF90_DEF_DIM(ntrajid, 'n', NF90_UNLIMITED, n_dim) |
---|
| 77 | IF (iret .NE. NF90_NOERR) CALL ctl_stop('icebergs, icb_trj_init: nf_def_dim n failed') |
---|
| 78 | iret = NF90_DEF_DIM(ntrajid, 'k', nkounts, m_dim) |
---|
| 79 | IF (iret .NE. NF90_NOERR) CALL ctl_stop('icebergs, icb_trj_init: nf_def_dim k failed') |
---|
| 80 | |
---|
| 81 | ! Variables |
---|
| 82 | iret = NF90_DEF_VAR(ntrajid, 'iceberg_number', NF90_INT, (/m_dim,n_dim/), numberid) |
---|
| 83 | iret = NF90_DEF_VAR(ntrajid, 'timestep', NF90_INT, n_dim, nstepid) |
---|
| 84 | iret = NF90_DEF_VAR(ntrajid, 'mass_scaling', NF90_DOUBLE, n_dim, nscaling_id) |
---|
| 85 | iret = NF90_DEF_VAR(ntrajid, 'lon', NF90_DOUBLE, n_dim, nlonid) |
---|
| 86 | iret = NF90_DEF_VAR(ntrajid, 'lat', NF90_DOUBLE, n_dim, nlatid) |
---|
| 87 | iret = NF90_DEF_VAR(ntrajid, 'xi', NF90_DOUBLE, n_dim, nxid) |
---|
| 88 | iret = NF90_DEF_VAR(ntrajid, 'yj', NF90_DOUBLE, n_dim, nyid) |
---|
| 89 | iret = NF90_DEF_VAR(ntrajid, 'uvel', NF90_DOUBLE, n_dim, nuvelid) |
---|
| 90 | iret = NF90_DEF_VAR(ntrajid, 'vvel', NF90_DOUBLE, n_dim, nvvelid) |
---|
| 91 | iret = NF90_DEF_VAR(ntrajid, 'uto', NF90_DOUBLE, n_dim, nuoid) |
---|
| 92 | iret = NF90_DEF_VAR(ntrajid, 'vto', NF90_DOUBLE, n_dim, nvoid) |
---|
| 93 | iret = NF90_DEF_VAR(ntrajid, 'uta', NF90_DOUBLE, n_dim, nuaid) |
---|
| 94 | iret = NF90_DEF_VAR(ntrajid, 'vta', NF90_DOUBLE, n_dim, nvaid) |
---|
| 95 | iret = NF90_DEF_VAR(ntrajid, 'uti', NF90_DOUBLE, n_dim, nuiid) |
---|
| 96 | iret = NF90_DEF_VAR(ntrajid, 'vti', NF90_DOUBLE, n_dim, nviid) |
---|
| 97 | iret = NF90_DEF_VAR(ntrajid, 'ssh_x', NF90_DOUBLE, n_dim, nsshyid) |
---|
| 98 | iret = NF90_DEF_VAR(ntrajid, 'ssh_y', NF90_DOUBLE, n_dim, nsshxid) |
---|
| 99 | iret = NF90_DEF_VAR(ntrajid, 'sst', NF90_DOUBLE, n_dim, nsstid) |
---|
| 100 | iret = NF90_DEF_VAR(ntrajid, 'icnt', NF90_DOUBLE, n_dim, ncntid) |
---|
| 101 | iret = NF90_DEF_VAR(ntrajid, 'ithk', NF90_DOUBLE, n_dim, nthkid) |
---|
| 102 | iret = NF90_DEF_VAR(ntrajid, 'mass', NF90_DOUBLE, n_dim, nmassid) |
---|
| 103 | iret = NF90_DEF_VAR(ntrajid, 'thickness', NF90_DOUBLE, n_dim, nthicknessid) |
---|
| 104 | iret = NF90_DEF_VAR(ntrajid, 'width', NF90_DOUBLE, n_dim, nwidthid) |
---|
| 105 | iret = NF90_DEF_VAR(ntrajid, 'length', NF90_DOUBLE, n_dim, nlengthid) |
---|
| 106 | iret = NF90_DEF_VAR(ntrajid, 'year', NF90_INT, n_dim, nyearid) |
---|
| 107 | iret = NF90_DEF_VAR(ntrajid, 'day', NF90_DOUBLE, n_dim, ndayid) |
---|
| 108 | iret = NF90_DEF_VAR(ntrajid, 'mass_of_bits', NF90_DOUBLE, n_dim, nmass_of_bits_id) |
---|
| 109 | iret = NF90_DEF_VAR(ntrajid, 'heat_density', NF90_DOUBLE, n_dim, nheat_density_id) |
---|
| 110 | |
---|
| 111 | ! Attributes |
---|
| 112 | iret = NF90_PUT_ATT(ntrajid, numberid, 'long_name', 'iceberg number on this processor') |
---|
| 113 | iret = NF90_PUT_ATT(ntrajid, numberid, 'units', 'count') |
---|
| 114 | iret = NF90_PUT_ATT(ntrajid, nstepid, 'long_name', 'timestep number kt') |
---|
| 115 | iret = NF90_PUT_ATT(ntrajid, nstepid, 'units', 'count') |
---|
| 116 | iret = NF90_PUT_ATT(ntrajid, nlonid, 'long_name', 'longitude') |
---|
| 117 | iret = NF90_PUT_ATT(ntrajid, nlonid, 'units', 'degrees_E') |
---|
| 118 | iret = NF90_PUT_ATT(ntrajid, nlatid, 'long_name', 'latitude') |
---|
| 119 | iret = NF90_PUT_ATT(ntrajid, nlatid, 'units', 'degrees_N') |
---|
| 120 | iret = NF90_PUT_ATT(ntrajid, nxid, 'long_name', 'x grid box position') |
---|
| 121 | iret = NF90_PUT_ATT(ntrajid, nxid, 'units', 'fractional') |
---|
| 122 | iret = NF90_PUT_ATT(ntrajid, nyid, 'long_name', 'y grid box position') |
---|
| 123 | iret = NF90_PUT_ATT(ntrajid, nyid, 'units', 'fractional') |
---|
| 124 | iret = NF90_PUT_ATT(ntrajid, nuvelid, 'long_name', 'zonal velocity') |
---|
| 125 | iret = NF90_PUT_ATT(ntrajid, nuvelid, 'units', 'm/s') |
---|
| 126 | iret = NF90_PUT_ATT(ntrajid, nvvelid, 'long_name', 'meridional velocity') |
---|
| 127 | iret = NF90_PUT_ATT(ntrajid, nvvelid, 'units', 'm/s') |
---|
| 128 | iret = NF90_PUT_ATT(ntrajid, nuoid, 'long_name', 'ocean u component') |
---|
| 129 | iret = NF90_PUT_ATT(ntrajid, nuoid, 'units', 'm/s') |
---|
| 130 | iret = NF90_PUT_ATT(ntrajid, nvoid, 'long_name', 'ocean v component') |
---|
| 131 | iret = NF90_PUT_ATT(ntrajid, nvoid, 'units', 'm/s') |
---|
| 132 | iret = NF90_PUT_ATT(ntrajid, nuaid, 'long_name', 'atmosphere u component') |
---|
| 133 | iret = NF90_PUT_ATT(ntrajid, nuaid, 'units', 'm/s') |
---|
| 134 | iret = NF90_PUT_ATT(ntrajid, nvaid, 'long_name', 'atmosphere v component') |
---|
| 135 | iret = NF90_PUT_ATT(ntrajid, nvaid, 'units', 'm/s') |
---|
| 136 | iret = NF90_PUT_ATT(ntrajid, nuiid, 'long_name', 'sea ice u component') |
---|
| 137 | iret = NF90_PUT_ATT(ntrajid, nuiid, 'units', 'm/s') |
---|
| 138 | iret = NF90_PUT_ATT(ntrajid, nviid, 'long_name', 'sea ice v component') |
---|
| 139 | iret = NF90_PUT_ATT(ntrajid, nviid, 'units', 'm/s') |
---|
| 140 | iret = NF90_PUT_ATT(ntrajid, nsshxid, 'long_name', 'sea surface height gradient from x points') |
---|
| 141 | iret = NF90_PUT_ATT(ntrajid, nsshxid, 'units', 'm/m') |
---|
| 142 | iret = NF90_PUT_ATT(ntrajid, nsshyid, 'long_name', 'sea surface height gradient from y points') |
---|
| 143 | iret = NF90_PUT_ATT(ntrajid, nsshyid, 'units', 'm/m') |
---|
| 144 | iret = NF90_PUT_ATT(ntrajid, nsstid, 'long_name', 'sea surface temperature') |
---|
| 145 | iret = NF90_PUT_ATT(ntrajid, nsstid, 'units', 'degC') |
---|
| 146 | iret = NF90_PUT_ATT(ntrajid, ncntid, 'long_name', 'sea ice concentration') |
---|
| 147 | iret = NF90_PUT_ATT(ntrajid, ncntid, 'units', 'degC') |
---|
| 148 | iret = NF90_PUT_ATT(ntrajid, nthkid, 'long_name', 'sea ice thickness') |
---|
| 149 | iret = NF90_PUT_ATT(ntrajid, nthkid, 'units', 'm') |
---|
| 150 | iret = NF90_PUT_ATT(ntrajid, nmassid, 'long_name', 'mass') |
---|
| 151 | iret = NF90_PUT_ATT(ntrajid, nmassid, 'units', 'kg') |
---|
| 152 | iret = NF90_PUT_ATT(ntrajid, nthicknessid, 'long_name', 'thickness') |
---|
| 153 | iret = NF90_PUT_ATT(ntrajid, nthicknessid, 'units', 'm') |
---|
| 154 | iret = NF90_PUT_ATT(ntrajid, nwidthid, 'long_name', 'width') |
---|
| 155 | iret = NF90_PUT_ATT(ntrajid, nwidthid, 'units', 'm') |
---|
| 156 | iret = NF90_PUT_ATT(ntrajid, nlengthid, 'long_name', 'length') |
---|
| 157 | iret = NF90_PUT_ATT(ntrajid, nlengthid, 'units', 'm') |
---|
| 158 | iret = NF90_PUT_ATT(ntrajid, nyearid, 'long_name', 'calendar year') |
---|
| 159 | iret = NF90_PUT_ATT(ntrajid, nyearid, 'units', 'years') |
---|
| 160 | iret = NF90_PUT_ATT(ntrajid, ndayid, 'long_name', 'day of year') |
---|
| 161 | iret = NF90_PUT_ATT(ntrajid, ndayid, 'units', 'days') |
---|
| 162 | iret = NF90_PUT_ATT(ntrajid, nscaling_id, 'long_name', 'scaling factor for mass of berg') |
---|
| 163 | iret = NF90_PUT_ATT(ntrajid, nscaling_id, 'units', 'none') |
---|
| 164 | iret = NF90_PUT_ATT(ntrajid, nmass_of_bits_id, 'long_name', 'mass of bergy bits') |
---|
| 165 | iret = NF90_PUT_ATT(ntrajid, nmass_of_bits_id, 'units', 'kg') |
---|
| 166 | iret = NF90_PUT_ATT(ntrajid, nheat_density_id, 'long_name', 'heat density') |
---|
| 167 | iret = NF90_PUT_ATT(ntrajid, nheat_density_id, 'units', 'J/kg') |
---|
| 168 | |
---|
| 169 | ! End define mode |
---|
| 170 | iret = NF90_ENDDEF(ntrajid) |
---|
| 171 | ! |
---|
| 172 | END SUBROUTINE icb_trj_init |
---|
| 173 | |
---|
| 174 | |
---|
| 175 | SUBROUTINE icb_trj_write( kt ) |
---|
| 176 | !!---------------------------------------------------------------------- |
---|
| 177 | !! *** ROUTINE icb_trj_write *** |
---|
| 178 | !! |
---|
| 179 | !! ** Purpose : write out iceberg trajectories |
---|
| 180 | !! |
---|
| 181 | !! ** Method : - for the moment write out each snapshot of positions later |
---|
| 182 | !! can rewrite so that it is buffered and written out more efficiently |
---|
| 183 | !!---------------------------------------------------------------------- |
---|
| 184 | INTEGER, INTENT( in ) :: kt |
---|
| 185 | ! |
---|
| 186 | INTEGER :: iret, jn |
---|
| 187 | CHARACTER(len=80) :: cl_filename |
---|
| 188 | TYPE(iceberg), POINTER :: this |
---|
| 189 | TYPE(point) , POINTER :: pt |
---|
| 190 | !!---------------------------------------------------------------------- |
---|
| 191 | |
---|
| 192 | ! Write variables |
---|
| 193 | ! sga - just write out the current point of the trajectory |
---|
| 194 | |
---|
| 195 | this => first_berg |
---|
| 196 | jn = num_traj |
---|
| 197 | DO WHILE (ASSOCIATED(this)) |
---|
| 198 | pt => this%current_point |
---|
| 199 | jn=jn+1 |
---|
| 200 | |
---|
| 201 | iret = NF90_PUT_VAR(ntrajid, numberid, this%number, (/1,jn/), (/nkounts,1/) ) |
---|
| 202 | iret = NF90_PUT_VAR(ntrajid, nstepid, kt, (/ jn /) ) |
---|
| 203 | iret = NF90_PUT_VAR(ntrajid, nscaling_id, this%mass_scaling, (/ jn /) ) |
---|
| 204 | |
---|
| 205 | iret = NF90_PUT_VAR(ntrajid, nlonid, pt%lon, (/ jn /) ) |
---|
| 206 | iret = NF90_PUT_VAR(ntrajid, nlatid, pt%lat, (/ jn /) ) |
---|
| 207 | iret = NF90_PUT_VAR(ntrajid, nxid, pt%xi, (/ jn /) ) |
---|
| 208 | iret = NF90_PUT_VAR(ntrajid, nyid, pt%yj, (/ jn /) ) |
---|
| 209 | iret = NF90_PUT_VAR(ntrajid, nuvelid, pt%uvel, (/ jn /) ) |
---|
| 210 | iret = NF90_PUT_VAR(ntrajid, nvvelid, pt%vvel, (/ jn /) ) |
---|
| 211 | iret = NF90_PUT_VAR(ntrajid, nuoid, pt%uo, (/ jn /) ) |
---|
| 212 | iret = NF90_PUT_VAR(ntrajid, nvoid, pt%vo, (/ jn /) ) |
---|
| 213 | iret = NF90_PUT_VAR(ntrajid, nuaid, pt%ua, (/ jn /) ) |
---|
| 214 | iret = NF90_PUT_VAR(ntrajid, nvaid, pt%va, (/ jn /) ) |
---|
| 215 | iret = NF90_PUT_VAR(ntrajid, nuiid, pt%ui, (/ jn /) ) |
---|
| 216 | iret = NF90_PUT_VAR(ntrajid, nviid, pt%vi, (/ jn /) ) |
---|
| 217 | iret = NF90_PUT_VAR(ntrajid, nsshxid, pt%ssh_x, (/ jn /) ) |
---|
| 218 | iret = NF90_PUT_VAR(ntrajid, nsshyid, pt%ssh_y, (/ jn /) ) |
---|
| 219 | iret = NF90_PUT_VAR(ntrajid, nsstid, pt%sst, (/ jn /) ) |
---|
| 220 | iret = NF90_PUT_VAR(ntrajid, ncntid, pt%cn, (/ jn /) ) |
---|
| 221 | iret = NF90_PUT_VAR(ntrajid, nthkid, pt%hi, (/ jn /) ) |
---|
| 222 | iret = NF90_PUT_VAR(ntrajid, nmassid, pt%mass, (/ jn /) ) |
---|
| 223 | iret = NF90_PUT_VAR(ntrajid, nthicknessid, pt%thickness, (/ jn /) ) |
---|
| 224 | iret = NF90_PUT_VAR(ntrajid, nwidthid, pt%width, (/ jn /) ) |
---|
| 225 | iret = NF90_PUT_VAR(ntrajid, nlengthid, pt%length, (/ jn /) ) |
---|
| 226 | iret = NF90_PUT_VAR(ntrajid, nyearid, pt%year, (/ jn /) ) |
---|
| 227 | iret = NF90_PUT_VAR(ntrajid, ndayid, pt%day, (/ jn /) ) |
---|
| 228 | iret = NF90_PUT_VAR(ntrajid, nmass_of_bits_id, pt%mass_of_bits, (/ jn /) ) |
---|
| 229 | iret = NF90_PUT_VAR(ntrajid, nheat_density_id, pt%heat_density, (/ jn /) ) |
---|
| 230 | |
---|
| 231 | this=>this%next |
---|
| 232 | END DO |
---|
| 233 | IF( lwp .and. nn_verbose_level > 0 ) WRITE(numout,*) 'trajectory write to frame ', jn |
---|
| 234 | num_traj = jn |
---|
| 235 | ! |
---|
| 236 | END SUBROUTINE icb_trj_write |
---|
| 237 | |
---|
| 238 | !!------------------------------------------------------------------------- |
---|
| 239 | |
---|
| 240 | SUBROUTINE icb_trj_sync() |
---|
| 241 | !!---------------------------------------------------------------------- |
---|
| 242 | !! *** ROUTINE icb_trj_sync *** |
---|
| 243 | !! |
---|
| 244 | !! ** Purpose : |
---|
| 245 | !!---------------------------------------------------------------------- |
---|
| 246 | INTEGER :: iret |
---|
| 247 | !!---------------------------------------------------------------------- |
---|
| 248 | ! flush to file |
---|
| 249 | iret = NF90_SYNC(ntrajid) |
---|
| 250 | IF(iret /= NF90_NOERR) CALL ctl_stop( 'icebergs, icb_trj_sync: nf_sync failed' ) |
---|
| 251 | ! |
---|
| 252 | END SUBROUTINE icb_trj_sync |
---|
| 253 | |
---|
| 254 | |
---|
| 255 | SUBROUTINE icb_trj_end() |
---|
| 256 | ! Local variables |
---|
| 257 | INTEGER :: iret |
---|
| 258 | !!---------------------------------------------------------------------- |
---|
| 259 | ! Finish up |
---|
| 260 | iret = NF90_CLOSE(ntrajid) |
---|
| 261 | IF (iret /= NF90_NOERR) CALL ctl_stop( 'icebergs, icb_trj_end: nf_close failed' ) |
---|
| 262 | ! |
---|
| 263 | END SUBROUTINE icb_trj_end |
---|
| 264 | |
---|
| 265 | !!------------------------------------------------------------------------- |
---|
| 266 | |
---|
| 267 | END MODULE icbtrj |
---|