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.
flowri.F90 in branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/FLO – NEMO

source: branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/FLO/flowri.F90 @ 4416

Last change on this file since 4416 was 3211, checked in by spickles2, 12 years ago

Stephen Pickles, 11 Dec 2011

Commit to bring the rest of the DCSE NEMO development branch
in line with the latest development version. This includes
array index re-ordering of all OPA_SRC/.

  • Property svn:keywords set to Id
File size: 13.2 KB
Line 
1MODULE flowri
2   !!======================================================================
3   !!                       ***  MODULE  flowri  ***
4   !! lagrangian floats :   outputs
5   !!======================================================================
6   !! History :   OPA  ! 1999-09  (Y. Drillet)  Original code
7   !!                  ! 2000-06  (J.-M. Molines)  Profiling floats for CLS
8   !!   NEMO      1.0  ! 2002-11  (G. Madec, A. Bozec)  F90: Free form and module
9   !!----------------------------------------------------------------------
10#if   defined key_floats   ||   defined key_esopa
11   !!----------------------------------------------------------------------
12   !!   'key_floats'                                     float trajectories
13   !!----------------------------------------------------------------------
14   !!    flowri     : write trajectories of floats in file
15   !!----------------------------------------------------------------------
16   USE flo_oce         ! ocean drifting floats
17   USE oce             ! ocean dynamics and tracers
18   USE dom_oce         ! ocean space and time domain
19   USE lib_mpp         ! distribued memory computing library
20   USE in_out_manager  ! I/O manager
21
22   IMPLICIT NONE
23   PRIVATE
24
25   PUBLIC   flo_wri         ! routine called by floats.F90
26   PUBLIC   flo_wri_alloc   ! routine called by floats.F90
27
28   INTEGER ::   jfl      ! number of floats
29   INTEGER ::   numflo   ! logical unit for drifting floats
30
31   ! Following are only workspace arrays but shape is not (jpi,jpj) and
32   ! therefore make them module arrays rather than replacing with wrk_nemo
33   ! member arrays.
34   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ztemp, zsal   ! 2D workspace
35
36   !! * Control permutation of array indices
37#  include "oce_ftrans.h90"
38#  include "dom_oce_ftrans.h90"
39#  include "flo_oce_ftrans.h90"
40
41   !! * Substitutions
42#  include "domzgr_substitute.h90"
43   !!----------------------------------------------------------------------
44   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
45   !! $Id$
46   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
47   !!----------------------------------------------------------------------
48CONTAINS
49
50   INTEGER FUNCTION flo_wri_alloc
51      !!-------------------------------------------------------------------
52      !!                ***  FUNCTION flo_wri_alloc  ***
53      !!-------------------------------------------------------------------
54      ALLOCATE( ztemp(jpk,jpnfl) , zsal(jpk,jpnfl) , STAT=flo_wri_alloc)
55      !
56      IF( lk_mpp             )   CALL mpp_sum ( flo_wri_alloc )
57      IF( flo_wri_alloc /= 0 )   CALL ctl_warn('flo_wri_alloc: failed to allocate arrays.')
58   END FUNCTION flo_wri_alloc
59
60
61   SUBROUTINE flo_wri( kt )
62      !!-------------------------------------------------------------------
63      !!                  ***  ROUTINE flo_wri  ***
64      !!             
65      !! ** Purpose :   Write position of floats in "trajec_float" file
66      !!      and the temperature and salinity at this position
67      !!     
68      !! ** Method  :   The frequency is nn_writefl
69      !!----------------------------------------------------------------------
70      INTEGER ::   kt   ! time step
71      !!
72      CHARACTER (len=21) ::  clname
73      INTEGER ::   inum   ! temporary logical unit for restart file
74      INTEGER ::   iafl, ibfl, icfl, ia1fl, ib1fl, ic1fl, jfl, irecflo
75      INTEGER ::   iafloc, ibfloc, ia1floc, ib1floc, iafln, ibfln
76      INTEGER  ::    ic, jc , jpn
77      INTEGER, DIMENSION ( jpnij )  ::   iproc
78      REAL(wp) ::   zafl, zbfl, zcfl, zdtj
79      REAL(wp) ::   zxxu, zxxu_01,zxxu_10, zxxu_11
80      !!---------------------------------------------------------------------
81     
82      IF( kt == nit000 .OR. MOD( kt,nn_writefl) == 0 ) THEN 
83
84         ! header of output floats file
85     
86         IF(lwp) THEN
87            WRITE(numout,*)
88            WRITE(numout,*) 'flo_wri : write in trajec_float file '
89            WRITE(numout,*) '~~~~~~~    '
90         ENDIF
91
92         ! open the file numflo
93         CALL ctl_opn( numflo, 'trajec_float', 'REPLACE', 'UNFORMATTED', 'SEQUENTIAL', -1, numout, .FALSE. )
94
95         IF( kt == nit000 ) THEN
96            irecflo = NINT( (nitend-nit000) / FLOAT(nn_writefl) )
97            IF(lwp) WRITE(numflo)cexper,no,irecflo,jpnfl,nn_writefl
98         ENDIF
99         zdtj = rdt / 86400._wp
100
101         ! translation of index position in geographical position
102
103         IF( lk_mpp ) THEN
104            DO jfl = 1, jpnfl
105               iafl  = INT ( tpifl(jfl) )
106               ibfl  = INT ( tpjfl(jfl) )
107               icfl  = INT ( tpkfl(jfl) )
108               iafln = NINT( tpifl(jfl) )
109               ibfln = NINT( tpjfl(jfl) )
110               ia1fl = iafl + 1
111               ib1fl = ibfl + 1
112               ic1fl = icfl + 1
113               zafl  = tpifl(jfl) - FLOAT( iafl )
114               zbfl  = tpjfl(jfl) - FLOAT( ibfl )
115               zcfl  = tpkfl(jfl) - FLOAT( icfl )
116               IF(   iafl >= mig(nldi)-jpizoom+1 .AND. iafl <= mig(nlei)-jpizoom+1 .AND.   &
117                  &  ibfl >= mjg(nldj)-jpjzoom+1 .AND. ibfl <= mjg(nlej)-jpjzoom+1       ) THEN
118
119                  ! local index
120
121                  iafloc  = iafl -(mig(1)-jpizoom+1) + 1
122                  ibfloc  = ibfl -(mjg(1)-jpjzoom+1) + 1
123                  ia1floc = iafloc + 1
124                  ib1floc = ibfloc + 1
125
126                  flyy(jfl) = (1.-zafl)*(1.-zbfl)*gphit(iafloc ,ibfloc ) + (1.-zafl) * zbfl * gphit(iafloc ,ib1floc)   &
127                     &      +     zafl *(1.-zbfl)*gphit(ia1floc,ibfloc ) +     zafl  * zbfl * gphit(ia1floc,ib1floc)
128                  flxx(jfl) = (1.-zafl)*(1.-zbfl)*glamt(iafloc ,ibfloc ) + (1.-zafl) * zbfl * glamt(iafloc ,ib1floc)   &
129                     &      +     zafl *(1.-zbfl)*glamt(ia1floc,ibfloc ) +     zafl  * zbfl * glamt(ia1floc,ib1floc)
130                  flzz(jfl) = (1.-zcfl)*fsdepw(iafloc,ibfloc,icfl ) + zcfl * fsdepw(iafloc,ibfloc,ic1fl)
131
132                  ! Change  by Alexandra Bozec et Jean-Philippe Boulanger
133                  ! We save  the instantaneous profile of T and S of the column     
134                  ! ztemp(jfl)=tn(iafloc,ibfloc,icfl)
135                  ! zsal(jfl)=sn(iafloc,ibfloc,icfl)
136                  ztemp(1:jpk,jfl) = tn(iafloc,ibfloc,1:jpk)
137                  zsal (1:jpk,jfl) = sn(iafloc,ibfloc,1:jpk)           
138               ELSE
139                  flxx(jfl) = 0.
140                  flyy(jfl) = 0.
141                  flzz(jfl) = 0.
142                  ztemp(1:jpk,jfl) = 0.
143                  zsal (1:jpk,jfl) = 0.
144               ENDIF
145            END DO
146
147            CALL mpp_sum( flxx, jpnfl )   ! sums over the global domain
148            CALL mpp_sum( flyy, jpnfl )
149            CALL mpp_sum( flzz, jpnfl )
150            ! these 2 lines have accendentaly been removed from ATL6-V8 run hence
151            ! giving 0 salinity and temperature on the float trajectory
152!bug RB
153!compilation failed in mpp
154!            CALL mpp_sum( ztemp, jpk*jpnfl )
155!            CALL mpp_sum( zsal , jpk*jpnfl )
156
157         ELSE
158            DO jfl = 1, jpnfl
159               iafl  = INT (tpifl(jfl))
160               ibfl  = INT (tpjfl(jfl))
161               icfl  = INT (tpkfl(jfl))
162               iafln = NINT(tpifl(jfl))
163               ibfln = NINT(tpjfl(jfl))
164               ia1fl = iafl+1
165               ib1fl = ibfl+1
166               ic1fl = icfl+1
167               zafl  = tpifl(jfl) - FLOAT(iafl)
168               zbfl  = tpjfl(jfl) - FLOAT(ibfl)
169               zcfl  = tpkfl(jfl) - FLOAT(icfl)
170               iafloc  = iafl
171               ibfloc  = ibfl
172               ia1floc = iafloc + 1
173               ib1floc = ibfloc + 1
174               !
175               flyy(jfl) = (1.-zafl)*(1.-zbfl)*gphit(iafloc ,ibfloc ) + (1.-zafl) * zbfl * gphit(iafloc ,ib1floc)   &
176                         +     zafl *(1.-zbfl)*gphit(ia1floc,ibfloc ) +     zafl  * zbfl * gphit(ia1floc,ib1floc)
177               flxx(jfl) = (1.-zafl)*(1.-zbfl)*glamt(iafloc ,ibfloc ) + (1.-zafl) * zbfl * glamt(iafloc ,ib1floc)   &
178                         +     zafl *(1.-zbfl)*glamt(ia1floc,ibfloc ) +     zafl  * zbfl * glamt(ia1floc,ib1floc)
179               flzz(jfl) = (1.-zcfl)*fsdepw(iafloc,ibfloc,icfl ) + zcfl * fsdepw(iafloc,ibfloc,ic1fl)
180               !ALEX
181               ! Astuce pour ne pas avoir des flotteurs qui se baladent sur IDL
182               zxxu_11 = glamt(iafloc ,ibfloc )
183               zxxu_10 = glamt(iafloc ,ib1floc)
184               zxxu_01 = glamt(ia1floc,ibfloc )
185               zxxu    = glamt(ia1floc,ib1floc)
186
187               IF( iafloc == 52 )  zxxu_10 = -181
188               IF( iafloc == 52 )  zxxu_11 = -181
189               flxx(jfl)=(1.-zafl)*(1.-zbfl)* zxxu_11 + (1.-zafl)*    zbfl * zxxu_10   &
190                        +    zafl *(1.-zbfl)* zxxu_01 +     zafl *    zbfl * zxxu
191               !ALEX         
192               ! Change  by Alexandra Bozec et Jean-Philippe Boulanger
193               ! We save  the instantaneous profile of T and S of the column     
194               !     ztemp(jfl)=tn(iafloc,ibfloc,icfl)
195               !     zsal(jfl)=sn(iafloc,ibfloc,icfl)
196               ztemp(1:jpk,jfl) = tn(iafloc,ibfloc,1:jpk)
197               zsal (1:jpk,jfl) = sn(iafloc,ibfloc,1:jpk)
198            END DO
199         ENDIF
200
201         !
202         WRITE(numflo) flxx,flyy,flzz,nisobfl,ngrpfl,ztemp,zsal, FLOAT(ndastp)
203      !!
204      !! case when profiles are dumped. In order to save memory, dumps are
205      !! done level by level.
206      !      IF (mod(kt,nflclean) == 0.) THEN
207      !!     IF ( nwflo == nwprofil ) THEN
208      !        DO jk = 1,jpk
209      !         DO jfl=1,jpnfl
210      !         iafl= INT(tpifl(jfl))
211      !         ibfl=INT(tpjfl(jfl))
212      !         iafln=NINT(tpifl(jfl))
213      !         ibfln=NINT(tpjfl(jfl))
214      !# if defined key_mpp_mpi   
215      !        IF ( (iafl >= (mig(nldi)-jpizoom+1)) .AND.
216      !     $       (iafl <= (mig(nlei)-jpizoom+1)) .AND.
217      !     $       (ibfl >= (mjg(nldj)-jpjzoom+1)) .AND.
218      !     $       (ibfl <= (mjg(nlej)-jpjzoom+1)) ) THEN
219      !!
220      !! local index
221      !!
222      !         iafloc=iafln-(mig(1)-jpizoom+1)+1
223      !         ibfloc=ibfln-(mjg(1)-jpjzoom+1)+1
224      !!         IF (jk == 1 ) THEN
225      !!      PRINT *,'<<<>>> ',jfl,narea, iafloc ,ibfloc, iafln, ibfln,adatrj
226      !!         ENDIF
227      !# else
228      !         iafloc=iafln
229      !         ibfloc=ibfln
230      !# endif
231      !         ztemp(jfl)=tn(iafloc,ibfloc,jk)
232      !         zsal(jfl)=sn(iaflo!,ibfloc,jk)
233      !# if defined key_mpp_mpi   
234      !        ELSE
235      !         ztemp(jfl) = 0.
236      !         zsal(jfl) = 0.
237      !        ENDIF
238      !# endif
239      !! ... next float
240      !        END DO
241      !      IF( lk_mpp )   CALL mpp_sum( ztemp, jpnfl )
242      !      IF( lk_mpp )   CALL mpp_sum( zsal , jpnfl )
243      !
244      !      IF (lwp) THEN
245      !         WRITE(numflo) ztemp, zsal
246      !      ENDIF
247      !! ... next level jk
248      !      END DO
249      !! ... reset nwflo to 0 for ALL processors, if profile has been written
250      !!       nwflo = 0
251      !      ENDIF
252      !!
253      !      CALL flush (numflo)
254      !! ... time of dumping floats
255      !!      END IF
256      ENDIF
257     
258      IF( (MOD(kt,nn_stockfl) == 0) .OR. ( kt == nitend ) ) THEN 
259         ! Writing the restart file
260         IF(lwp) THEN
261            WRITE(numout,*)
262            WRITE(numout,*) 'flo_wri : write in  restart_float file '
263            WRITE(numout,*) '~~~~~~~    '
264         ENDIF
265
266         ! file is opened and closed every time it is used.
267
268         clname = 'restart.float.'
269         ic = 1
270         DO jc = 1, 16
271            IF( cexper(jc:jc) /= ' ' ) ic = jc
272         END DO
273         clname = clname(1:14)//cexper(1:ic)
274         ic = 1
275         DO jc = 1, 48
276            IF( clname(jc:jc) /= ' ' ) ic = jc
277         END DO
278
279         CALL ctl_opn( inum, clname, 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, .FALSE. )
280         REWIND inum
281         !
282         DO jpn = 1, jpnij
283            iproc(jpn) = 0
284         END DO
285         !
286         IF(lwp) THEN
287            REWIND(inum)
288            WRITE (inum) tpifl,tpjfl,tpkfl,nisobfl,ngrpfl
289            CLOSE (inum) 
290         ENDIF
291         !
292         ! Compute the number of trajectories for each processor
293         !
294         IF( lk_mpp ) THEN
295            DO jfl = 1, jpnfl
296               IF( (INT(tpifl(jfl)) >= (mig(nldi)-jpizoom+1)) .AND.   &
297                  &(INT(tpifl(jfl)) <= (mig(nlei)-jpizoom+1)) .AND.   &
298                  &(INT(tpjfl(jfl)) >= (mjg(nldj)-jpjzoom+1)) .AND.   &
299                  &(INT(tpjfl(jfl)) <= (mjg(nlej)-jpjzoom+1)) ) THEN
300                  iproc(narea) = iproc(narea)+1
301               ENDIF
302            END DO
303            CALL mpp_sum( iproc, jpnij )
304            !
305            IF(lwp) THEN
306               WRITE(numout,*) 'DATE',adatrj
307               DO jpn = 1, jpnij
308                  IF( iproc(jpn) /= 0 ) THEN
309                     WRITE(numout,*)'PROCESSOR',jpn-1,'compute',iproc(jpn), 'trajectories.'
310                  ENDIF
311               END DO
312            ENDIF
313         ENDIF
314      ENDIF
315
316      IF( kt == nitend )   CLOSE( numflo ) 
317      !
318   END SUBROUTINE flo_wri
319
320#  else
321   !!----------------------------------------------------------------------
322   !!   Default option                                         Empty module
323   !!----------------------------------------------------------------------
324CONTAINS
325   SUBROUTINE flo_wri                 ! Empty routine
326   END SUBROUTINE flo_wri
327#endif
328   
329   !!======================================================================
330END MODULE flowri
Note: See TracBrowser for help on using the repository browser.