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

source: branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/FLO/flowri.F90 @ 2236

Last change on this file since 2236 was 2236, checked in by cetlod, 14 years ago

First guess of NEMO_v3.3

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