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.
icbtrj.F90 in branches/2012/dev_r3337_NOCS10_ICB/NEMOGCM/NEMO/OPA_SRC/ICB – NEMO

source: branches/2012/dev_r3337_NOCS10_ICB/NEMOGCM/NEMO/OPA_SRC/ICB/icbtrj.F90 @ 3339

Last change on this file since 3339 was 3339, checked in by sga, 12 years ago

NEMO branch dev_r3337_NOCS10_ICB: add new iceberg sub-directory ICB

File size: 12.7 KB
Line 
1MODULE 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   !!   write_trajectory      :
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   INTEGER, PRIVATE   ::   kount_traj
29   INTEGER, PRIVATE   ::   n_dim, k_dim
30   INTEGER, PRIVATE   ::   trajid
31   INTEGER, PRIVATE   ::   numberid, stepid, scaling_id
32   INTEGER, PRIVATE   ::   lonid, latid, xid, yid, uvelid, vvelid, massid
33   INTEGER, PRIVATE   ::   uoid, void, uaid, vaid, uiid, viid
34   INTEGER, PRIVATE   ::   sshxid, sshyid, sstid, cntid, thkid
35   INTEGER, PRIVATE   ::   thicknessid, widthid, lengthid
36   INTEGER, PRIVATE   ::   yearid, dayid
37   INTEGER, PRIVATE   ::   mass_of_bits_id, heat_density_id
38
39   PUBLIC   traj_init           ! routine called in xxx.F90 module
40   PUBLIC   traj_write          ! routine called in xxx.F90 module
41   PUBLIC   traj_sync           ! routine called in xxx.F90 module
42   PUBLIC   traj_end            ! routine called in xxx.F90 module
43
44CONTAINS
45
46   !!-------------------------------------------------------------------------
47
48   SUBROUTINE traj_init( nitend )
49
50      ! local variables
51      INTEGER, INTENT( in )                 :: nitend
52      ! Local variables
53      INTEGER                               :: iret, k
54      CHARACTER(len=80)                     :: filename
55      TYPE(iceberg), POINTER                :: this
56      TYPE(point)  , POINTER                :: pt
57
58      IF( lk_mpp ) THEN
59         WRITE(filename,'("trajectory_icebergs_",I6.6,"_",I4.4,".nc")') nitend, narea-1
60      ELSE
61         WRITE(filename,'("trajectory_icebergs_",I6.6,".nc")') nitend
62      ENDIF
63      IF ( lwp .AND. nn_verbose_level >= 0) WRITE(numout,'(2a)') 'icebergs, traj_init: creating ',TRIM(filename)
64
65      iret = NF90_CREATE(TRIM(filename), NF90_CLOBBER, trajid)
66      IF (iret .NE. NF90_NOERR) CALL ctl_stop('icebergs, traj_init: nf_create failed')
67
68      ! Dimensions
69      iret = NF90_DEF_DIM(trajid, 'n', NF90_UNLIMITED, n_dim)
70      IF (iret .NE. NF90_NOERR) CALL ctl_stop('icebergs, traj_init: nf_def_dim n failed')
71      iret = NF90_DEF_DIM(trajid, 'k', nkounts, k_dim)
72      IF (iret .NE. NF90_NOERR) CALL ctl_stop('icebergs, traj_init: nf_def_dim k failed')
73
74      ! Variables
75      iret = NF90_DEF_VAR(trajid, 'iceberg_number', NF90_INT, (/k_dim,n_dim/), numberid)
76      iret = NF90_DEF_VAR(trajid, 'timestep', NF90_INT, n_dim, stepid)
77      iret = NF90_DEF_VAR(trajid, 'mass_scaling', NF90_DOUBLE, n_dim, scaling_id)
78      iret = NF90_DEF_VAR(trajid, 'lon', NF90_DOUBLE, n_dim, lonid)
79      iret = NF90_DEF_VAR(trajid, 'lat', NF90_DOUBLE, n_dim, latid)
80      iret = NF90_DEF_VAR(trajid, 'xi', NF90_DOUBLE, n_dim, xid)
81      iret = NF90_DEF_VAR(trajid, 'yj', NF90_DOUBLE, n_dim, yid)
82      iret = NF90_DEF_VAR(trajid, 'uvel', NF90_DOUBLE, n_dim, uvelid)
83      iret = NF90_DEF_VAR(trajid, 'vvel', NF90_DOUBLE, n_dim, vvelid)
84      iret = NF90_DEF_VAR(trajid, 'uto', NF90_DOUBLE, n_dim, uoid)
85      iret = NF90_DEF_VAR(trajid, 'vto', NF90_DOUBLE, n_dim, void)
86      iret = NF90_DEF_VAR(trajid, 'uta', NF90_DOUBLE, n_dim, uaid)
87      iret = NF90_DEF_VAR(trajid, 'vta', NF90_DOUBLE, n_dim, vaid)
88      iret = NF90_DEF_VAR(trajid, 'uti', NF90_DOUBLE, n_dim, uiid)
89      iret = NF90_DEF_VAR(trajid, 'vti', NF90_DOUBLE, n_dim, viid)
90      iret = NF90_DEF_VAR(trajid, 'ssh_x', NF90_DOUBLE, n_dim, sshyid)
91      iret = NF90_DEF_VAR(trajid, 'ssh_y', NF90_DOUBLE, n_dim, sshxid)
92      iret = NF90_DEF_VAR(trajid, 'sst', NF90_DOUBLE, n_dim, sstid)
93      iret = NF90_DEF_VAR(trajid, 'icnt', NF90_DOUBLE, n_dim, cntid)
94      iret = NF90_DEF_VAR(trajid, 'ithk', NF90_DOUBLE, n_dim, thkid)
95      iret = NF90_DEF_VAR(trajid, 'mass', NF90_DOUBLE, n_dim, massid)
96      iret = NF90_DEF_VAR(trajid, 'thickness', NF90_DOUBLE, n_dim, thicknessid)
97      iret = NF90_DEF_VAR(trajid, 'width', NF90_DOUBLE, n_dim, widthid)
98      iret = NF90_DEF_VAR(trajid, 'length', NF90_DOUBLE, n_dim, lengthid)
99      iret = NF90_DEF_VAR(trajid, 'year', NF90_INT, n_dim, yearid)
100      iret = NF90_DEF_VAR(trajid, 'day', NF90_DOUBLE, n_dim, dayid)
101      iret = NF90_DEF_VAR(trajid, 'mass_of_bits', NF90_DOUBLE, n_dim, mass_of_bits_id)
102      iret = NF90_DEF_VAR(trajid, 'heat_density', NF90_DOUBLE, n_dim, heat_density_id)
103
104      ! Attributes
105      iret = NF90_PUT_ATT(trajid, numberid, 'long_name', 'iceberg number on this processor')
106      iret = NF90_PUT_ATT(trajid, numberid, 'units', 'count')
107      iret = NF90_PUT_ATT(trajid, stepid, 'long_name', 'timestep number kt')
108      iret = NF90_PUT_ATT(trajid, stepid, 'units', 'count')
109      iret = NF90_PUT_ATT(trajid, lonid, 'long_name', 'longitude')
110      iret = NF90_PUT_ATT(trajid, lonid, 'units', 'degrees_E')
111      iret = NF90_PUT_ATT(trajid, latid, 'long_name', 'latitude')
112      iret = NF90_PUT_ATT(trajid, latid, 'units', 'degrees_N')
113      iret = NF90_PUT_ATT(trajid, xid, 'long_name', 'x grid box position')
114      iret = NF90_PUT_ATT(trajid, xid, 'units', 'fractional')
115      iret = NF90_PUT_ATT(trajid, yid, 'long_name', 'y grid box position')
116      iret = NF90_PUT_ATT(trajid, yid, 'units', 'fractional')
117      iret = NF90_PUT_ATT(trajid, uvelid, 'long_name', 'zonal velocity')
118      iret = NF90_PUT_ATT(trajid, uvelid, 'units', 'm/s')
119      iret = NF90_PUT_ATT(trajid, vvelid, 'long_name', 'meridional velocity')
120      iret = NF90_PUT_ATT(trajid, vvelid, 'units', 'm/s')
121      iret = NF90_PUT_ATT(trajid, uoid, 'long_name', 'ocean u component')
122      iret = NF90_PUT_ATT(trajid, uoid, 'units', 'm/s')
123      iret = NF90_PUT_ATT(trajid, void, 'long_name', 'ocean v component')
124      iret = NF90_PUT_ATT(trajid, void, 'units', 'm/s')
125      iret = NF90_PUT_ATT(trajid, uaid, 'long_name', 'atmosphere u component')
126      iret = NF90_PUT_ATT(trajid, uaid, 'units', 'm/s')
127      iret = NF90_PUT_ATT(trajid, vaid, 'long_name', 'atmosphere v component')
128      iret = NF90_PUT_ATT(trajid, vaid, 'units', 'm/s')
129      iret = NF90_PUT_ATT(trajid, uiid, 'long_name', 'sea ice u component')
130      iret = NF90_PUT_ATT(trajid, uiid, 'units', 'm/s')
131      iret = NF90_PUT_ATT(trajid, viid, 'long_name', 'sea ice v component')
132      iret = NF90_PUT_ATT(trajid, viid, 'units', 'm/s')
133      iret = NF90_PUT_ATT(trajid, sshxid, 'long_name', 'sea surface height gradient from x points')
134      iret = NF90_PUT_ATT(trajid, sshxid, 'units', 'm/m')
135      iret = NF90_PUT_ATT(trajid, sshyid, 'long_name', 'sea surface height gradient from y points')
136      iret = NF90_PUT_ATT(trajid, sshyid, 'units', 'm/m')
137      iret = NF90_PUT_ATT(trajid, sstid, 'long_name', 'sea surface temperature')
138      iret = NF90_PUT_ATT(trajid, sstid, 'units', 'degC')
139      iret = NF90_PUT_ATT(trajid, cntid, 'long_name', 'sea ice concentration')
140      iret = NF90_PUT_ATT(trajid, cntid, 'units', 'degC')
141      iret = NF90_PUT_ATT(trajid, thkid, 'long_name', 'sea ice thickness')
142      iret = NF90_PUT_ATT(trajid, thkid, 'units', 'm')
143      iret = NF90_PUT_ATT(trajid, massid, 'long_name', 'mass')
144      iret = NF90_PUT_ATT(trajid, massid, 'units', 'kg')
145      iret = NF90_PUT_ATT(trajid, thicknessid, 'long_name', 'thickness')
146      iret = NF90_PUT_ATT(trajid, thicknessid, 'units', 'm')
147      iret = NF90_PUT_ATT(trajid, widthid, 'long_name', 'width')
148      iret = NF90_PUT_ATT(trajid, widthid, 'units', 'm')
149      iret = NF90_PUT_ATT(trajid, lengthid, 'long_name', 'length')
150      iret = NF90_PUT_ATT(trajid, lengthid, 'units', 'm')
151      iret = NF90_PUT_ATT(trajid, yearid, 'long_name', 'calendar year')
152      iret = NF90_PUT_ATT(trajid, yearid, 'units', 'years')
153      iret = NF90_PUT_ATT(trajid, dayid, 'long_name', 'day of year')
154      iret = NF90_PUT_ATT(trajid, dayid, 'units', 'days')
155      iret = NF90_PUT_ATT(trajid, scaling_id, 'long_name', 'scaling factor for mass of berg')
156      iret = NF90_PUT_ATT(trajid, scaling_id, 'units', 'none')
157      iret = NF90_PUT_ATT(trajid, mass_of_bits_id, 'long_name', 'mass of bergy bits')
158      iret = NF90_PUT_ATT(trajid, mass_of_bits_id, 'units', 'kg')
159      iret = NF90_PUT_ATT(trajid, heat_density_id, 'long_name', 'heat density')
160      iret = NF90_PUT_ATT(trajid, heat_density_id, 'units', 'J/kg')
161
162      ! End define mode
163      iret = NF90_ENDDEF(trajid)
164
165   END SUBROUTINE traj_init
166
167   !!-------------------------------------------------------------------------
168
169   SUBROUTINE traj_write( kt )
170      !! for the moment write out each snapshot of positions
171      !! later can rewrite so that it is buffered and written out more efficiently
172
173      INTEGER, INTENT( in )                 :: kt
174      ! Local variables
175      INTEGER                               :: iret, k
176      CHARACTER(len=80)                     :: filename
177      TYPE(iceberg), POINTER                :: this
178      TYPE(point)  , POINTER                :: pt
179
180      ! Write variables
181      ! sga - just write out the current point of the trajectory
182
183      this => first_berg
184      k = kount_traj
185      DO WHILE (ASSOCIATED(this))
186         pt => this%current_point
187         k=k+1
188
189         iret = NF90_PUT_VAR(trajid, numberid, this%number, (/1,k/), (/nkounts,1/) )
190         iret = NF90_PUT_VAR(trajid, stepid, kt, (/ k /) )
191         iret = NF90_PUT_VAR(trajid, scaling_id, this%mass_scaling, (/ k /) )
192
193         iret = NF90_PUT_VAR(trajid, lonid, pt%lon, (/ k /) )
194         iret = NF90_PUT_VAR(trajid, latid, pt%lat, (/ k /) )
195         iret = NF90_PUT_VAR(trajid, xid, pt%xi, (/ k /) )
196         iret = NF90_PUT_VAR(trajid, yid, pt%yj, (/ k /) )
197         iret = NF90_PUT_VAR(trajid, uvelid, pt%uvel, (/ k /) )
198         iret = NF90_PUT_VAR(trajid, vvelid, pt%vvel, (/ k /) )
199         iret = NF90_PUT_VAR(trajid, uoid, pt%uo, (/ k /) )
200         iret = NF90_PUT_VAR(trajid, void, pt%vo, (/ k /) )
201         iret = NF90_PUT_VAR(trajid, uaid, pt%ua, (/ k /) )
202         iret = NF90_PUT_VAR(trajid, vaid, pt%va, (/ k /) )
203         iret = NF90_PUT_VAR(trajid, uiid, pt%ui, (/ k /) )
204         iret = NF90_PUT_VAR(trajid, viid, pt%vi, (/ k /) )
205         iret = NF90_PUT_VAR(trajid, sshxid, pt%ssh_x, (/ k /) )
206         iret = NF90_PUT_VAR(trajid, sshyid, pt%ssh_y, (/ k /) )
207         iret = NF90_PUT_VAR(trajid, sstid, pt%sst, (/ k /) )
208         iret = NF90_PUT_VAR(trajid, cntid, pt%cn, (/ k /) )
209         iret = NF90_PUT_VAR(trajid, thkid, pt%hi, (/ k /) )
210         iret = NF90_PUT_VAR(trajid, massid, pt%mass, (/ k /) )
211         iret = NF90_PUT_VAR(trajid, thicknessid, pt%thickness, (/ k /) )
212         iret = NF90_PUT_VAR(trajid, widthid, pt%width, (/ k /) )
213         iret = NF90_PUT_VAR(trajid, lengthid, pt%length, (/ k /) )
214         iret = NF90_PUT_VAR(trajid, yearid, pt%year, (/ k /) )
215         iret = NF90_PUT_VAR(trajid, dayid, pt%day, (/ k /) )
216         iret = NF90_PUT_VAR(trajid, mass_of_bits_id, pt%mass_of_bits, (/ k /) )
217         iret = NF90_PUT_VAR(trajid, heat_density_id, pt%heat_density, (/ k /) )
218
219         this=>this%next
220      ENDDO
221      IF( lwp .and. nn_verbose_level > 0 ) WRITE(numout,*) 'trajectory write to frame ', k
222      kount_traj = k
223
224   END SUBROUTINE traj_write
225
226   !!-------------------------------------------------------------------------
227
228   SUBROUTINE traj_sync()
229      ! Local variables
230      INTEGER                               :: iret
231
232      ! flush to file
233      iret = NF90_SYNC(trajid)
234      IF (iret .NE. NF90_NOERR) CALL ctl_stop('icebergs, traj_sync: nf_sync failed')
235
236   END SUBROUTINE traj_sync
237
238   !!-------------------------------------------------------------------------
239
240   SUBROUTINE traj_end()
241      ! Local variables
242      INTEGER                               :: iret
243
244      ! Finish up
245      iret = NF90_CLOSE(trajid)
246      IF (iret .NE. NF90_NOERR) CALL ctl_stop('icebergs, traj_end: nf_close failed')
247
248   END SUBROUTINE traj_end
249
250   !!-------------------------------------------------------------------------
251
252END MODULE icbtrj
Note: See TracBrowser for help on using the repository browser.