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

source: branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/OPA_SRC/FLO/flowri.F90 @ 2590

Last change on this file since 2590 was 2590, checked in by trackstand2, 13 years ago

Merge branch 'dynamic_memory' into master-svn-dyn

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