source: LMDZ6/trunk/libf/phylmd/oasis.F90 @ 4629

Last change on this file since 4629 was 4619, checked in by yann meurdesoif, 12 months ago

Suppress usage of preprocessing key CPP_XIOS.
Wrapper file is used to suppress XIOS symbol when xios is not linked and not used (-io ioipsl)
The CPP_XIOS key is replaced in model by "using_xios" boolean variable to switch between IOIPSL or XIOS output.

YM

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 22.4 KB
Line 
1!
2MODULE oasis
3!
4! This module contains subroutines for initialization, sending and receiving
5! towards the coupler OASIS3. It also contains some parameters for the coupling.
6!
7! This module should always be compiled. With the coupler OASIS3 available the cpp key
8! CPP_COUPLE should be set and the entier of this file will then be compiled.
9! In a forced mode CPP_COUPLE should not be defined and the compilation ends before
10! the CONTAINS, without compiling the subroutines.
11!
12  USE dimphy
13  USE mod_phys_lmdz_para
14  USE write_field_phy
15
16#ifdef CPP_COUPLE
17! Use of Oasis-MCT coupler
18#if defined CPP_OMCT
19  USE mod_prism
20! Use of Oasis3 coupler
21#else
22  USE mod_prism_proto
23  USE mod_prism_def_partition_proto
24  USE mod_prism_get_proto
25  USE mod_prism_put_proto
26#endif
27#ifdef CPP_CPLOCNINCA
28  USE incaoasis, ONLY : inforcv
29#endif
30#endif
31 
32  IMPLICIT NONE
33 
34  ! Id for fields sent to ocean
35  INTEGER, PARAMETER :: ids_tauxxu = 1
36  INTEGER, PARAMETER :: ids_tauyyu = 2
37  INTEGER, PARAMETER :: ids_tauzzu = 3
38  INTEGER, PARAMETER :: ids_tauxxv = 4
39  INTEGER, PARAMETER :: ids_tauyyv = 5
40  INTEGER, PARAMETER :: ids_tauzzv = 6
41  INTEGER, PARAMETER :: ids_windsp = 7
42  INTEGER, PARAMETER :: ids_shfice = 8
43  INTEGER, PARAMETER :: ids_shfoce = 9
44  INTEGER, PARAMETER :: ids_shftot = 10
45  INTEGER, PARAMETER :: ids_nsfice = 11
46  INTEGER, PARAMETER :: ids_nsfoce = 12
47  INTEGER, PARAMETER :: ids_nsftot = 13
48  INTEGER, PARAMETER :: ids_dflxdt = 14
49  INTEGER, PARAMETER :: ids_totrai = 15
50  INTEGER, PARAMETER :: ids_totsno = 16
51  INTEGER, PARAMETER :: ids_toteva = 17
52  INTEGER, PARAMETER :: ids_icevap = 18
53  INTEGER, PARAMETER :: ids_ocevap = 19
54  INTEGER, PARAMETER :: ids_calvin = 20
55  INTEGER, PARAMETER :: ids_liqrun = 21
56  INTEGER, PARAMETER :: ids_runcoa = 22
57  INTEGER, PARAMETER :: ids_rivflu = 23
58  INTEGER, PARAMETER :: ids_atmco2 = 24
59  INTEGER, PARAMETER :: ids_taumod = 25
60  INTEGER, PARAMETER :: ids_qraioc = 26
61  INTEGER, PARAMETER :: ids_qsnooc = 27
62  INTEGER, PARAMETER :: ids_qraiic = 28
63  INTEGER, PARAMETER :: ids_qsnoic = 29
64  INTEGER, PARAMETER :: ids_delta_sst = 30, ids_delta_sal = 31, ids_dter = 32, &
65       ids_dser = 33, ids_dt_ds = 34
66 
67  INTEGER, PARAMETER :: maxsend    = 34  ! Maximum number of fields to send
68 
69  ! Id for fields received from ocean
70
71  INTEGER, PARAMETER :: idr_sisutw = 1
72  INTEGER, PARAMETER :: idr_icecov = 2
73  INTEGER, PARAMETER :: idr_icealw = 3
74  INTEGER, PARAMETER :: idr_icetem = 4
75  INTEGER, PARAMETER :: idr_curenx = 5
76  INTEGER, PARAMETER :: idr_cureny = 6
77  INTEGER, PARAMETER :: idr_curenz = 7
78  INTEGER, PARAMETER :: idr_oceco2 = 8
79
80  INTEGER, PARAMETER :: idr_sss = 9
81  ! bulk salinity of the surface layer of the ocean, in ppt
82
83  INTEGER, PARAMETER :: maxrecv    = 9  ! Maximum number of fields to receive
84 
85#ifdef CPP_CPLOCNINCA
86  INTEGER, PARAMETER :: idr_ocedms = 1
87  INTEGER, PARAMETER :: maxrcv = 1
88#endif
89
90  TYPE, PUBLIC ::   FLD_CPL            ! Type for coupling field information
91     CHARACTER(len = 8) ::   name      ! Name of the coupling field   
92     LOGICAL            ::   action    ! To be exchanged or not
93     INTEGER            ::   nid       ! Id of the field
94  END TYPE FLD_CPL
95
96  TYPE(FLD_CPL), DIMENSION(maxsend), SAVE, PUBLIC :: infosend   ! Information for sending coupling fields
97!$OMP THREADPRIVATE(infosend)
98  TYPE(FLD_CPL), DIMENSION(maxrecv), SAVE, PUBLIC :: inforecv   ! Information for receiving coupling fields
99!$OMP THREADPRIVATE(inforecv)
100 
101  LOGICAL,SAVE :: cpl_current
102!$OMP THREADPRIVATE(cpl_current)
103
104#ifdef CPP_COUPLE
105
106CONTAINS
107
108  SUBROUTINE inicma
109!************************************************************************************
110!**** *INICMA*  - Initialize coupled mode communication for atmosphere
111!                 and exchange some initial information with Oasis
112!
113!     Rewrite to take the PRISM/psmile library into account
114!     LF 09/2003
115!
116    USE IOIPSL
117    USE surface_data, ONLY : version_ocean
118    USE carbon_cycle_mod, ONLY : carbon_cycle_cpl
119    USE wxios, ONLY : wxios_context_init
120    USE lmdz_xios 
121    USE print_control_mod, ONLY: lunout
122    USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat, grid_type, unstructured, regular_lonlat
123    USE geometry_mod, ONLY: ind_cell_glo                   
124    USE mod_phys_lmdz_mpi_data, ONLY: klon_mpi_para_nb
125    use config_ocean_skin_m, only: activate_ocean_skin
126
127! Local variables
128!************************************************************************************
129    INTEGER                            :: comp_id
130    INTEGER                            :: ierror, il_commlocal
131    INTEGER                            :: il_part_id
132    INTEGER, ALLOCATABLE               :: ig_paral(:)
133    INTEGER, DIMENSION(2)              :: il_var_nodims
134    INTEGER, DIMENSION(4)              :: il_var_actual_shape
135    INTEGER                            :: il_var_type
136    INTEGER                            :: jf
137    CHARACTER (len = 6)                :: clmodnam
138    CHARACTER (len = 20)               :: modname = 'inicma'
139    CHARACTER (len = 80)               :: abort_message
140    LOGICAL, SAVE                      :: cpl_current_omp
141    INTEGER, DIMENSION(klon_mpi)       :: ind_cell_glo_mpi
142
143!*    1. Initializations
144!        ---------------
145!************************************************************************************
146    WRITE(lunout,*) ' '
147    WRITE(lunout,*) ' '
148    WRITE(lunout,*) ' ROUTINE INICMA'
149    WRITE(lunout,*) ' **************'
150    WRITE(lunout,*) ' '
151    WRITE(lunout,*) ' '
152
153!
154! Define the model name
155!
156    IF (grid_type==unstructured) THEN
157        clmodnam = 'icosa'                 ! as in $NBMODEL in Cpl/Nam/namcouple.tmp
158    ELSE IF (grid_type==regular_lonlat) THEN
159        clmodnam = 'LMDZ'                  ! as in $NBMODEL in Cpl/Nam/namcouple.tmp
160    ELSE
161        abort_message='Pb : type of grid unknown'
162        CALL abort_physic(modname,abort_message,1)
163    ENDIF
164
165
166!************************************************************************************
167! Define if coupling ocean currents or not
168!************************************************************************************
169!$OMP MASTER
170    cpl_current_omp = .FALSE.
171    CALL getin('cpl_current', cpl_current_omp)
172!$OMP END MASTER
173!$OMP BARRIER
174    cpl_current = cpl_current_omp
175    WRITE(lunout,*) 'Couple ocean currents, cpl_current = ',cpl_current
176
177!************************************************************************************
178! Gather global index to be used for oasis decomposition
179!************************************************************************************
180    CALL gather_omp(ind_cell_glo,ind_cell_glo_mpi)
181
182!************************************************************************************
183! Define coupling variables
184!************************************************************************************
185
186! Atmospheric variables to send
187
188!$OMP MASTER
189    infosend(:)%action = .FALSE.
190
191    infosend(ids_tauxxu)%action = .TRUE. ; infosend(ids_tauxxu)%name = 'COTAUXXU'
192    infosend(ids_tauyyu)%action = .TRUE. ; infosend(ids_tauyyu)%name = 'COTAUYYU'
193    infosend(ids_tauzzu)%action = .TRUE. ; infosend(ids_tauzzu)%name = 'COTAUZZU'
194    infosend(ids_tauxxv)%action = .TRUE. ; infosend(ids_tauxxv)%name = 'COTAUXXV'
195    infosend(ids_tauyyv)%action = .TRUE. ; infosend(ids_tauyyv)%name = 'COTAUYYV'
196    infosend(ids_tauzzv)%action = .TRUE. ; infosend(ids_tauzzv)%name = 'COTAUZZV'
197    infosend(ids_windsp)%action = .TRUE. ; infosend(ids_windsp)%name = 'COWINDSP'
198    infosend(ids_shfice)%action = .TRUE. ; infosend(ids_shfice)%name = 'COSHFICE'
199    infosend(ids_nsfice)%action = .TRUE. ; infosend(ids_nsfice)%name = 'CONSFICE'
200    infosend(ids_dflxdt)%action = .TRUE. ; infosend(ids_dflxdt)%name = 'CODFLXDT'
201    infosend(ids_calvin)%action = .TRUE. ; infosend(ids_calvin)%name = 'COCALVIN'
202   
203    if (activate_ocean_skin == 2) then
204       infosend(ids_delta_sst)%action = .TRUE.
205       infosend(ids_delta_sst)%name = 'CODELSST'
206       infosend(ids_delta_sal)%action = .TRUE.
207       infosend(ids_delta_sal)%name = 'CODELSSS'
208       infosend(ids_dter)%action = .TRUE.
209       infosend(ids_dter)%name = 'CODELTER'
210       infosend(ids_dser)%action = .TRUE.
211       infosend(ids_dser)%name = 'CODELSER'
212       infosend(ids_dt_ds)%action = .TRUE.
213       infosend(ids_dt_ds)%name = 'CODTDS'
214    end if
215           
216    IF (version_ocean=='nemo') THEN
217        infosend(ids_shftot)%action = .TRUE. ; infosend(ids_shftot)%name = 'COQSRMIX'
218        infosend(ids_nsftot)%action = .TRUE. ; infosend(ids_nsftot)%name = 'COQNSMIX'
219        infosend(ids_totrai)%action = .TRUE. ; infosend(ids_totrai)%name = 'COTOTRAI'
220        infosend(ids_totsno)%action = .TRUE. ; infosend(ids_totsno)%name = 'COTOTSNO'
221        infosend(ids_toteva)%action = .TRUE. ; infosend(ids_toteva)%name = 'COTOTEVA'
222        infosend(ids_icevap)%action = .TRUE. ; infosend(ids_icevap)%name = 'COICEVAP'
223        infosend(ids_liqrun)%action = .TRUE. ; infosend(ids_liqrun)%name = 'COLIQRUN'
224        infosend(ids_taumod)%action = .TRUE. ; infosend(ids_taumod)%name = 'COTAUMOD'
225        IF (carbon_cycle_cpl) THEN
226            infosend(ids_atmco2)%action = .TRUE. ; infosend(ids_atmco2)%name = 'COATMCO2'
227        ENDIF
228        infosend(ids_qraioc)%action = .TRUE. ; infosend(ids_qraioc)%name = 'COQRAIOC'
229        infosend(ids_qsnooc)%action = .TRUE. ; infosend(ids_qsnooc)%name = 'COQSNOOC'
230        infosend(ids_qraiic)%action = .TRUE. ; infosend(ids_qraiic)%name = 'COQRAIIC'
231        infosend(ids_qsnoic)%action = .TRUE. ; infosend(ids_qsnoic)%name = 'COQSNOIC'
232       
233    ELSE IF (version_ocean=='opa8') THEN
234        infosend(ids_shfoce)%action = .TRUE. ; infosend(ids_shfoce)%name = 'COSHFOCE'
235        infosend(ids_nsfoce)%action = .TRUE. ; infosend(ids_nsfoce)%name = 'CONSFOCE'
236        infosend(ids_icevap)%action = .TRUE. ; infosend(ids_icevap)%name = 'COTFSICE'
237        infosend(ids_ocevap)%action = .TRUE. ; infosend(ids_ocevap)%name = 'COTFSOCE'
238        infosend(ids_totrai)%action = .TRUE. ; infosend(ids_totrai)%name = 'COTOLPSU'
239        infosend(ids_totsno)%action = .TRUE. ; infosend(ids_totsno)%name = 'COTOSPSU'
240        infosend(ids_runcoa)%action = .TRUE. ; infosend(ids_runcoa)%name = 'CORUNCOA'
241        infosend(ids_rivflu)%action = .TRUE. ; infosend(ids_rivflu)%name = 'CORIVFLU'
242   ENDIF
243       
244! Oceanic variables to receive
245
246   inforecv(:)%action = .FALSE.
247
248   inforecv(idr_sisutw)%action = .TRUE. ; inforecv(idr_sisutw)%name = 'SISUTESW'
249   inforecv(idr_icecov)%action = .TRUE. ; inforecv(idr_icecov)%name = 'SIICECOV'
250   inforecv(idr_icealw)%action = .TRUE. ; inforecv(idr_icealw)%name = 'SIICEALW'
251   inforecv(idr_icetem)%action = .TRUE. ; inforecv(idr_icetem)%name = 'SIICTEMW'
252
253   if (activate_ocean_skin >= 1) then
254      inforecv(idr_sss)%action = .TRUE.
255      inforecv(idr_sss)%name = 'SISUSALW'
256   end if
257   
258   IF (cpl_current ) THEN
259       inforecv(idr_curenx)%action = .TRUE. ; inforecv(idr_curenx)%name = 'CURRENTX'
260       inforecv(idr_cureny)%action = .TRUE. ; inforecv(idr_cureny)%name = 'CURRENTY'
261       inforecv(idr_curenz)%action = .TRUE. ; inforecv(idr_curenz)%name = 'CURRENTZ'
262   ENDIF
263
264   IF (carbon_cycle_cpl ) THEN
265       inforecv(idr_oceco2)%action = .TRUE. ; inforecv(idr_oceco2)%name = 'SICO2FLX'
266   ENDIF
267#ifdef CPP_CPLOCNINCA
268       inforcv(idr_ocedms)%action = .TRUE. ; inforcv(idr_ocedms)%name = 'SIDMSFLX'
269#endif
270
271!************************************************************************************
272! Here we go: psmile initialisation
273!************************************************************************************
274    IF (is_sequential) THEN
275       CALL prism_init_comp_proto (comp_id, clmodnam, ierror)
276       
277       IF (ierror .NE. PRISM_Ok) THEN
278          abort_message=' Probleme init dans prism_init_comp '
279          CALL abort_physic(modname,abort_message,1)
280       ELSE
281          WRITE(lunout,*) 'inicma : init psmile ok '
282       ENDIF
283    ENDIF
284
285    CALL prism_get_localcomm_proto (il_commlocal, ierror)
286!************************************************************************************
287! Domain decomposition
288!************************************************************************************
289    IF (grid_type==unstructured) THEN
290
291      ALLOCATE( ig_paral(klon_mpi_para_nb(mpi_rank) + 2) )
292
293      ig_paral(1) = 4                                      ! points partition for //
294      ig_paral(2) = klon_mpi_para_nb(mpi_rank)             ! nb of local cells
295
296      DO jf=1, klon_mpi_para_nb(mpi_rank)
297        ig_paral(2+jf) = ind_cell_glo_mpi(jf)
298      ENDDO
299
300    ELSE IF (grid_type==regular_lonlat) THEN
301
302      ALLOCATE( ig_paral(3) )
303
304      ig_paral(1) = 1                            ! apple partition for //
305      ig_paral(2) = (jj_begin-1)*nbp_lon+ii_begin-1  ! offset
306      ig_paral(3) = (jj_end*nbp_lon+ii_end) - (jj_begin*nbp_lon+ii_begin) + 1
307
308      IF (mpi_rank==mpi_size-1) ig_paral(3)=ig_paral(3)+nbp_lon-1
309    ELSE
310      abort_message='Pb : type of grid unknown'
311      CALL abort_physic(modname,abort_message,1)
312    ENDIF
313
314
315    WRITE(lunout,*) mpi_rank,'ig_paral--->',ig_paral(2),ig_paral(3)
316   
317    ierror=PRISM_Ok
318    CALL prism_def_partition_proto (il_part_id, ig_paral, ierror)
319
320    IF (ierror .NE. PRISM_Ok) THEN
321       abort_message=' Probleme dans prism_def_partition '
322       CALL abort_physic(modname,abort_message,1)
323    ELSE
324       WRITE(lunout,*) 'inicma : decomposition domaine psmile ok '
325    ENDIF
326
327    il_var_nodims(1) = 2                        ! rank of field array (1d or 2d)
328    il_var_nodims(2) = 1                        ! always 1 in current oasis version" doc oasis3mct p18
329
330    il_var_actual_shape(1) = 1                  ! min of 1st dimension (always 1)
331    il_var_actual_shape(2) = nbp_lon            ! max of 1st dimension
332    il_var_actual_shape(3) = 1                  ! min of 2nd dimension (always 1)
333    il_var_actual_shape(4) = nbp_lat            ! max of 2nd dimension
334   
335    il_var_type = PRISM_Real
336
337!************************************************************************************
338! Oceanic Fields to receive
339! Loop over all possible variables
340!************************************************************************************
341    DO jf=1, maxrecv
342       IF (inforecv(jf)%action) THEN
343          CALL prism_def_var_proto(inforecv(jf)%nid, inforecv(jf)%name, il_part_id, &
344               il_var_nodims, PRISM_In, il_var_actual_shape, il_var_type, &
345               ierror)
346          IF (ierror .NE. PRISM_Ok) THEN
347             WRITE(lunout,*) 'inicma : Problem with prism_def_var_proto for field : ',&
348                  inforecv(jf)%name
349             abort_message=' Problem in call to prism_def_var_proto for fields to receive'
350             CALL abort_physic(modname,abort_message,1)
351          ENDIF
352       ENDIF
353    END DO
354
355! Now, if also coupling CPL with INCA, initialize here fields to be exchanged.
356#ifdef CPP_CPLOCNINCA
357    DO jf=1,maxrcv
358       IF (inforcv(jf)%action) THEN
359          CALL prism_def_var_proto(inforcv(jf)%nid, inforcv(jf)%name, il_part_id, &
360               il_var_nodims, PRISM_In, il_var_actual_shape, il_var_type, &
361               ierror)
362          IF (ierror .NE. PRISM_Ok) THEN
363             WRITE(lunout,*) 'inicma : Problem with prism_def_var_proto for field : ',&
364                  inforcv(jf)%name
365             abort_message=' Problem in call to prism_def_var_proto for fields to receive'
366             CALL abort_physic(modname,abort_message,1)
367          ENDIF
368       ENDIF
369    END DO
370#endif
371 
372!************************************************************************************
373! Atmospheric Fields to send
374! Loop over all possible variables
375!************************************************************************************
376    DO jf=1,maxsend
377       IF (infosend(jf)%action) THEN
378          CALL prism_def_var_proto(infosend(jf)%nid, infosend(jf)%name, il_part_id, &
379               il_var_nodims, PRISM_Out, il_var_actual_shape, il_var_type, &
380               ierror)
381          IF (ierror .NE. PRISM_Ok) THEN
382             WRITE(lunout,*) 'inicma : Problem with prism_def_var_proto for field : ',&
383                  infosend(jf)%name
384             abort_message=' Problem in call to prism_def_var_proto for fields to send'
385             CALL abort_physic(modname,abort_message,1)
386          ENDIF
387       ENDIF
388    END DO
389   
390!************************************************************************************
391! End definition
392!************************************************************************************
393
394    IF (using_xios) CALL xios_oasis_enddef()
395
396    CALL prism_enddef_proto(ierror)
397    IF (ierror .NE. PRISM_Ok) THEN
398       abort_message=' Problem in call to prism_endef_proto'
399       CALL abort_physic(modname,abort_message,1)
400    ELSE
401       WRITE(lunout,*) 'inicma : endef psmile ok '
402    ENDIF
403
404S!$OMP END MASTER
405   
406  END SUBROUTINE inicma
407
408!
409!************************************************************************************
410!
411
412  SUBROUTINE fromcpl(ktime, tab_get)
413! ======================================================================
414! L. Fairhead (09/2003) adapted From L.Z.X Li: this subroutine reads the SST
415! and Sea-Ice provided by the coupler. Adaptation to psmile library
416!======================================================================
417!
418    USE print_control_mod, ONLY: lunout
419    USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat
420! Input arguments
421!************************************************************************************
422    INTEGER, INTENT(IN)                               ::  ktime
423
424! Output arguments
425!************************************************************************************
426    REAL, DIMENSION(nbp_lon, jj_nb,maxrecv), INTENT(OUT) :: tab_get
427
428! Local variables
429!************************************************************************************
430    INTEGER                       :: ierror, i
431    INTEGER                       :: istart,iend
432    CHARACTER (len = 20)          :: modname = 'fromcpl'
433    CHARACTER (len = 80)          :: abort_message
434    REAL, DIMENSION(nbp_lon*jj_nb)    :: field
435
436!************************************************************************************
437    WRITE (lunout,*) ' '
438    WRITE (lunout,*) 'Fromcpl: Reading fields from CPL, ktime=',ktime
439    WRITE (lunout,*) ' '
440   
441    istart=ii_begin
442    IF (is_south_pole_dyn) THEN
443       iend=(jj_end-jj_begin)*nbp_lon+nbp_lon
444    ELSE
445       iend=(jj_end-jj_begin)*nbp_lon+ii_end
446    ENDIF
447   
448    DO i = 1, maxrecv
449      IF (inforecv(i)%action .AND. inforecv(i)%nid .NE. -1) THEN
450          field(:) = -99999.
451          CALL prism_get_proto(inforecv(i)%nid, ktime, field(istart:iend), ierror)
452          tab_get(:,:,i) = RESHAPE(field(:),(/nbp_lon,jj_nb/))
453       
454          IF (ierror .NE. PRISM_Ok .AND. ierror.NE.PRISM_Recvd .AND. &
455             ierror.NE.PRISM_FromRest &
456             .AND. ierror.NE.PRISM_Input .AND. ierror.NE.PRISM_RecvOut &
457             .AND. ierror.NE.PRISM_FromRestOut) THEN
458              WRITE (lunout,*)  'Error with receiving filed : ', inforecv(i)%name, ktime   
459              abort_message=' Problem in prism_get_proto '
460              CALL abort_physic(modname,abort_message,1)
461          ENDIF
462      ENDIF
463    END DO
464   
465   
466  END SUBROUTINE fromcpl
467
468!
469!************************************************************************************
470!
471
472  SUBROUTINE intocpl(ktime, last, tab_put)
473! ======================================================================
474! L. Fairhead (09/2003) adapted From L.Z.X Li: this subroutine provides the
475! atmospheric coupling fields to the coupler with the psmile library.
476! IF last time step, writes output fields to binary files.
477! ======================================================================
478!
479!
480    USE print_control_mod, ONLY: lunout
481    USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat
482! Input arguments
483!************************************************************************************
484    INTEGER, INTENT(IN)                              :: ktime
485    LOGICAL, INTENT(IN)                              :: last
486    REAL, DIMENSION(nbp_lon, jj_nb, maxsend), INTENT(IN) :: tab_put
487
488! Local variables
489!************************************************************************************
490    LOGICAL                          :: checkout
491    INTEGER                          :: istart,iend
492    INTEGER                          :: wstart,wend
493    INTEGER                          :: ierror, i
494    REAL, DIMENSION(nbp_lon*jj_nb)       :: field
495    CHARACTER (len = 20),PARAMETER   :: modname = 'intocpl'
496    CHARACTER (len = 80)             :: abort_message
497
498!************************************************************************************
499    checkout=.FALSE.
500
501    WRITE(lunout,*) ' '
502    WRITE(lunout,*) 'Intocpl: sending fields to CPL, ktime= ', ktime
503    WRITE(lunout,*) 'last = ', last
504    WRITE(lunout,*)
505
506
507    istart=ii_begin
508    IF (is_south_pole_dyn) THEN
509       iend=(jj_end-jj_begin)*nbp_lon+nbp_lon
510    ELSE
511       iend=(jj_end-jj_begin)*nbp_lon+ii_end
512    ENDIF
513   
514    IF (checkout) THEN   
515       wstart=istart
516       wend=iend
517       IF (is_north_pole_dyn) wstart=istart+nbp_lon-1
518       IF (is_south_pole_dyn) wend=iend-nbp_lon+1
519       
520       DO i = 1, maxsend
521          IF (infosend(i)%action) THEN
522             field = RESHAPE(tab_put(:,:,i),(/nbp_lon*jj_nb/))
523             CALL writefield_phy(infosend(i)%name,field(wstart:wend),1)
524          END IF
525       END DO
526    END IF
527
528!************************************************************************************
529! PRISM_PUT
530!************************************************************************************
531
532    DO i = 1, maxsend
533      IF (infosend(i)%action .AND. infosend(i)%nid .NE. -1 ) THEN
534          field = RESHAPE(tab_put(:,:,i),(/nbp_lon*jj_nb/))
535          CALL prism_put_proto(infosend(i)%nid, ktime, field(istart:iend), ierror)
536         
537          IF (ierror .NE. PRISM_Ok .AND. ierror.NE.PRISM_Sent .AND. ierror.NE.PRISM_ToRest &
538             .AND. ierror.NE.PRISM_LocTrans .AND. ierror.NE.PRISM_Output .AND. &
539             ierror.NE.PRISM_SentOut .AND. ierror.NE.PRISM_ToRestOut) THEN
540              WRITE (lunout,*) 'Error with sending field :', infosend(i)%name, ktime   
541              abort_message=' Problem in prism_put_proto '
542              CALL abort_physic(modname,abort_message,1)
543          ENDIF
544      ENDIF
545    END DO
546   
547!************************************************************************************
548! Finalize PSMILE for the case is_sequential, if parallel finalization is done
549! from Finalize_parallel in dyn3dpar/parallel.F90
550!************************************************************************************
551
552    IF (last) THEN
553       IF (is_sequential) THEN
554          CALL prism_terminate_proto(ierror)
555          IF (ierror .NE. PRISM_Ok) THEN
556             abort_message=' Problem in prism_terminate_proto '
557             CALL abort_physic(modname,abort_message,1)
558          ENDIF
559       ENDIF
560    ENDIF
561   
562   
563  END SUBROUTINE intocpl
564
565#endif
566 
567END MODULE oasis
Note: See TracBrowser for help on using the repository browser.