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 trunk/NEMOGCM/NEMO/OPA_SRC/FLO – NEMO

source: trunk/NEMOGCM/NEMO/OPA_SRC/FLO/flowri.F90 @ 2564

Last change on this file since 2564 was 2528, checked in by rblod, 13 years ago

Update NEMOGCM from branch nemo_v3_3_beta

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