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

Last change on this file since 5779 was 5618, checked in by aborella, 7 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
RevLine 
[782]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
[1965]17! Use of Oasis-MCT coupler
18#if defined CPP_OMCT
19  USE mod_prism
20! Use of Oasis3 coupler
21#else
[782]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
[1965]27#endif
[782]28 
29  IMPLICIT NONE
[1279]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
[2872]57  INTEGER, PARAMETER :: ids_qraioc = 26
58  INTEGER, PARAMETER :: ids_qsnooc = 27
59  INTEGER, PARAMETER :: ids_qraiic = 28
60  INTEGER, PARAMETER :: ids_qsnoic = 29
[4370]61  INTEGER, PARAMETER :: ids_delta_sst = 30, ids_delta_sal = 31, ids_dter = 32, &
62       ids_dser = 33, ids_dt_ds = 34
[1279]63 
[4370]64  INTEGER, PARAMETER :: maxsend    = 34  ! Maximum number of fields to send
[3815]65 
[1279]66  ! Id for fields received from ocean
[3815]67
[1279]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
[4640]76  ! bulk salinity of the surface layer of the ocean, in ppt
[3815]77  INTEGER, PARAMETER :: idr_sss = 9
[4640]78  INTEGER, PARAMETER :: idr_ocedms = 10
[4754]79  INTEGER, PARAMETER :: idr_ocen2o = 11
[3815]80
[4754]81  INTEGER, PARAMETER :: maxrecv      = 11     ! Maximum number of fields to receive
[4640]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
[1279]85 
[782]86
[1279]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
[782]92
[1279]93  TYPE(FLD_CPL), DIMENSION(maxsend), SAVE, PUBLIC :: infosend   ! Information for sending coupling fields
[2916]94!$OMP THREADPRIVATE(infosend)
[1279]95  TYPE(FLD_CPL), DIMENSION(maxrecv), SAVE, PUBLIC :: inforecv   ! Information for receiving coupling fields
[2916]96!$OMP THREADPRIVATE(inforecv)
[1279]97 
98  LOGICAL,SAVE :: cpl_current
99!$OMP THREADPRIVATE(cpl_current)
[782]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!
[1067]113    USE IOIPSL
[996]114    USE surface_data, ONLY : version_ocean
[1279]115    USE carbon_cycle_mod, ONLY : carbon_cycle_cpl
[5310]116    use wxios_mod, ONLY : wxios_context_init
[4754]117    USE chemistry_cycle_mod, ONLY : dms_cycle_cpl, n2o_cycle_cpl
[4619]118    USE lmdz_xios 
[2311]119    USE print_control_mod, ONLY: lunout
[3465]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
[3815]123    use config_ocean_skin_m, only: activate_ocean_skin
[5251]124    USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_INCA
[1279]125
[782]126! Local variables
127!************************************************************************************
128    INTEGER                            :: comp_id
129    INTEGER                            :: ierror, il_commlocal
130    INTEGER                            :: il_part_id
[3465]131    INTEGER, ALLOCATABLE               :: ig_paral(:)
[782]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
[5618]139    !! WARNING: cpl_current_omp should NOT be put in a THREADPRIVATE statement, it is shared between tasks
[1997]140    LOGICAL, SAVE                      :: cpl_current_omp
[4596]141    INTEGER, DIMENSION(klon_mpi)       :: ind_cell_glo_mpi
[782]142
[5618]143
[782]144!*    1. Initializations
145!        ---------------
146!************************************************************************************
[1279]147    WRITE(lunout,*) ' '
148    WRITE(lunout,*) ' '
149    WRITE(lunout,*) ' ROUTINE INICMA'
150    WRITE(lunout,*) ' **************'
151    WRITE(lunout,*) ' '
152    WRITE(lunout,*) ' '
[782]153
154!
155! Define the model name
156!
[3465]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
[1067]165
[1279]166
[782]167!************************************************************************************
[1067]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
[1279]176    WRITE(lunout,*) 'Couple ocean currents, cpl_current = ',cpl_current
[1067]177
178!************************************************************************************
[4596]179! Gather global index to be used for oasis decomposition
180!************************************************************************************
181    CALL gather_omp(ind_cell_glo,ind_cell_glo_mpi)
182
183!************************************************************************************
[1279]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   
[3815]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'
[4370]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'
[3815]215    end if
216           
[1279]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
[2872]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'
[1279]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'
[3815]253
254   if (activate_ocean_skin >= 1) then
255      inforecv(idr_sss)%action = .TRUE.
256      inforecv(idr_sss)%name = 'SISUSALW'
257   end if
[1279]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
[4640]268   IF (dms_cycle_cpl) THEN
269      inforecv(idr_ocedms)%action = .TRUE. ; inforecv(idr_ocedms)%name = 'SIDMSFLX'
270   ENDIF
[4754]271   IF (n2o_cycle_cpl) THEN
272      inforecv(idr_ocen2o)%action = .TRUE. ; inforecv(idr_ocen2o)%name = 'SIN2OFLX'
273   ENDIF
[4640]274 
[1279]275
276!************************************************************************************
[782]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 '
[2311]284          CALL abort_physic(modname,abort_message,1)
[782]285       ELSE
[1279]286          WRITE(lunout,*) 'inicma : init psmile ok '
[782]287       ENDIF
288    ENDIF
289
290    CALL prism_get_localcomm_proto (il_commlocal, ierror)
291!************************************************************************************
292! Domain decomposition
293!************************************************************************************
[3465]294    IF (grid_type==unstructured) THEN
[782]295
[3465]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)
[4596]302        ig_paral(2+jf) = ind_cell_glo_mpi(jf)
[3465]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
[1279]320    WRITE(lunout,*) mpi_rank,'ig_paral--->',ig_paral(2),ig_paral(3)
[782]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 '
[2311]327       CALL abort_physic(modname,abort_message,1)
[782]328    ELSE
[1279]329       WRITE(lunout,*) 'inicma : decomposition domaine psmile ok '
[782]330    ENDIF
331
[3465]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
[782]334
[3465]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
[782]339   
340    il_var_type = PRISM_Real
341
342!************************************************************************************
[1279]343! Oceanic Fields to receive
344! Loop over all possible variables
[782]345!************************************************************************************
[1279]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'
[2311]355             CALL abort_physic(modname,abort_message,1)
[1279]356          ENDIF
[782]357       ENDIF
358    END DO
[4247]359
[4640]360
[5251]361IF (CPPKEY_INCA) THEN
[4754]362    IF (dms_cycle_cpl .OR. n2o_cycle_cpl) THEN
363       CALL init_inca_oasis(inforecv(idr_ocedms:idr_ocen2o))
[4640]364    ENDIF
[5251]365END IF
[4247]366 
[782]367!************************************************************************************
[1279]368! Atmospheric Fields to send
369! Loop over all possible variables
[782]370!************************************************************************************
[1279]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'
[2311]380             CALL abort_physic(modname,abort_message,1)
[1279]381          ENDIF
[782]382       ENDIF
383    END DO
[1279]384   
[782]385!************************************************************************************
386! End definition
387!************************************************************************************
[4619]388
389    IF (using_xios) CALL xios_oasis_enddef()
390
[782]391    CALL prism_enddef_proto(ierror)
392    IF (ierror .NE. PRISM_Ok) THEN
[1279]393       abort_message=' Problem in call to prism_endef_proto'
[2311]394       CALL abort_physic(modname,abort_message,1)
[782]395    ELSE
[1279]396       WRITE(lunout,*) 'inicma : endef psmile ok '
[782]397    ENDIF
[1279]398
[4642]399!$OMP END MASTER
[782]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!
[2311]413    USE print_control_mod, ONLY: lunout
[2371]414    USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat
[782]415! Input arguments
416!************************************************************************************
417    INTEGER, INTENT(IN)                               ::  ktime
418
419! Output arguments
420!************************************************************************************
[4640]421    REAL, DIMENSION(nbp_lon, jj_nb,maxrecv_phys), INTENT(OUT) :: tab_get
[782]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
[2346]429    REAL, DIMENSION(nbp_lon*jj_nb)    :: field
[782]430
431!************************************************************************************
[1279]432    WRITE (lunout,*) ' '
433    WRITE (lunout,*) 'Fromcpl: Reading fields from CPL, ktime=',ktime
434    WRITE (lunout,*) ' '
[782]435   
436    istart=ii_begin
[2429]437    IF (is_south_pole_dyn) THEN
[2346]438       iend=(jj_end-jj_begin)*nbp_lon+nbp_lon
[782]439    ELSE
[2346]440       iend=(jj_end-jj_begin)*nbp_lon+ii_end
[782]441    ENDIF
442   
[4640]443    DO i = 1, maxrecv_phys
[1965]444      IF (inforecv(i)%action .AND. inforecv(i)%nid .NE. -1) THEN
[1279]445          field(:) = -99999.
446          CALL prism_get_proto(inforecv(i)%nid, ktime, field(istart:iend), ierror)
[2346]447          tab_get(:,:,i) = RESHAPE(field(:),(/nbp_lon,jj_nb/))
[782]448       
[1279]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 '
[2311]455              CALL abort_physic(modname,abort_message,1)
[1279]456          ENDIF
457      ENDIF
[782]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!
[2311]475    USE print_control_mod, ONLY: lunout
[2371]476    USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat
[782]477! Input arguments
478!************************************************************************************
[1279]479    INTEGER, INTENT(IN)                              :: ktime
480    LOGICAL, INTENT(IN)                              :: last
[2346]481    REAL, DIMENSION(nbp_lon, jj_nb, maxsend), INTENT(IN) :: tab_put
[782]482
483! Local variables
484!************************************************************************************
[987]485    LOGICAL                          :: checkout
486    INTEGER                          :: istart,iend
487    INTEGER                          :: wstart,wend
488    INTEGER                          :: ierror, i
[2346]489    REAL, DIMENSION(nbp_lon*jj_nb)       :: field
[987]490    CHARACTER (len = 20),PARAMETER   :: modname = 'intocpl'
491    CHARACTER (len = 80)             :: abort_message
[782]492
493!************************************************************************************
[987]494    checkout=.FALSE.
[782]495
[1279]496    WRITE(lunout,*) ' '
497    WRITE(lunout,*) 'Intocpl: sending fields to CPL, ktime= ', ktime
498    WRITE(lunout,*) 'last = ', last
499    WRITE(lunout,*)
[782]500
501
502    istart=ii_begin
[2429]503    IF (is_south_pole_dyn) THEN
[2346]504       iend=(jj_end-jj_begin)*nbp_lon+nbp_lon
[782]505    ELSE
[2346]506       iend=(jj_end-jj_begin)*nbp_lon+ii_end
[782]507    ENDIF
508   
509    IF (checkout) THEN   
510       wstart=istart
511       wend=iend
[2429]512       IF (is_north_pole_dyn) wstart=istart+nbp_lon-1
513       IF (is_south_pole_dyn) wend=iend-nbp_lon+1
[782]514       
[1279]515       DO i = 1, maxsend
516          IF (infosend(i)%action) THEN
[2346]517             field = RESHAPE(tab_put(:,:,i),(/nbp_lon*jj_nb/))
[1279]518             CALL writefield_phy(infosend(i)%name,field(wstart:wend),1)
519          END IF
520       END DO
521    END IF
522
[782]523!************************************************************************************
524! PRISM_PUT
525!************************************************************************************
526
[1279]527    DO i = 1, maxsend
[1965]528      IF (infosend(i)%action .AND. infosend(i)%nid .NE. -1 ) THEN
[2346]529          field = RESHAPE(tab_put(:,:,i),(/nbp_lon*jj_nb/))
[1279]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 '
[2311]537              CALL abort_physic(modname,abort_message,1)
[1279]538          ENDIF
539      ENDIF
[782]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
[1279]551             abort_message=' Problem in prism_terminate_proto '
[2311]552             CALL abort_physic(modname,abort_message,1)
[782]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.