source: LMDZ6/branches/contrails/libf/phylmd/oasis.F90 @ 5679

Last change on this file since 5679 was 5618, checked in by aborella, 3 months ago

Merge with trunk testing r5597. We have convergence in prod and debug in NPv7.0.1c

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