18 USE mod_prism_def_partition_proto
19 USE mod_prism_get_proto
20 USE mod_prism_put_proto
26 INTEGER,
PARAMETER :: ids_tauxxu = 1
27 INTEGER,
PARAMETER :: ids_tauyyu = 2
28 INTEGER,
PARAMETER :: ids_tauzzu = 3
29 INTEGER,
PARAMETER :: ids_tauxxv = 4
30 INTEGER,
PARAMETER :: ids_tauyyv = 5
31 INTEGER,
PARAMETER :: ids_tauzzv = 6
32 INTEGER,
PARAMETER :: ids_windsp = 7
33 INTEGER,
PARAMETER :: ids_shfice = 8
34 INTEGER,
PARAMETER :: ids_shfoce = 9
35 INTEGER,
PARAMETER :: ids_shftot = 10
36 INTEGER,
PARAMETER :: ids_nsfice = 11
37 INTEGER,
PARAMETER :: ids_nsfoce = 12
38 INTEGER,
PARAMETER :: ids_nsftot = 13
39 INTEGER,
PARAMETER :: ids_dflxdt = 14
40 INTEGER,
PARAMETER :: ids_totrai = 15
41 INTEGER,
PARAMETER :: ids_totsno = 16
42 INTEGER,
PARAMETER :: ids_toteva = 17
43 INTEGER,
PARAMETER :: ids_icevap = 18
44 INTEGER,
PARAMETER :: ids_ocevap = 19
45 INTEGER,
PARAMETER :: ids_calvin = 20
46 INTEGER,
PARAMETER :: ids_liqrun = 21
47 INTEGER,
PARAMETER :: ids_runcoa = 22
48 INTEGER,
PARAMETER :: ids_rivflu = 23
49 INTEGER,
PARAMETER :: ids_atmco2 = 24
50 INTEGER,
PARAMETER :: ids_taumod = 25
51 INTEGER,
PARAMETER :: maxsend = 25
54 INTEGER,
PARAMETER :: idr_sisutw = 1
55 INTEGER,
PARAMETER :: idr_icecov = 2
56 INTEGER,
PARAMETER :: idr_icealw = 3
57 INTEGER,
PARAMETER :: idr_icetem = 4
58 INTEGER,
PARAMETER :: idr_curenx = 5
59 INTEGER,
PARAMETER :: idr_cureny = 6
60 INTEGER,
PARAMETER :: idr_curenz = 7
61 INTEGER,
PARAMETER :: idr_oceco2 = 8
62 INTEGER,
PARAMETER :: maxrecv = 8
66 CHARACTER(len = 8) :: name
71 TYPE(fld_cpl),
DIMENSION(maxsend),
SAVE,
PUBLIC :: infosend
72 TYPE(fld_cpl),
DIMENSION(maxrecv),
SAVE,
PUBLIC :: inforecv
74 LOGICAL,
SAVE :: cpl_current
93 include
"dimensions.h"
99 INTEGER :: ierror, il_commlocal
100 INTEGER :: il_part_id
101 INTEGER,
DIMENSION(3) :: ig_paral
102 INTEGER,
DIMENSION(2) :: il_var_nodims
103 INTEGER,
DIMENSION(4) :: il_var_actual_shape
104 INTEGER :: il_var_type
106 CHARACTER (len = 6) :: clmodnam
107 CHARACTER (len = 20) :: modname =
'inicma'
108 CHARACTER (len = 80) :: abort_message
109 LOGICAL :: cpl_current_omp
116 WRITE(
lunout,*)
' ROUTINE INICMA'
117 WRITE(
lunout,*)
' **************'
131 cpl_current_omp = .
false.
132 CALL
getin(
'cpl_current', cpl_current_omp)
135 cpl_current = cpl_current_omp
136 WRITE(
lunout,*)
'Couple ocean currents, cpl_current = ',cpl_current
145 infosend(:)%action = .
false.
147 infosend(ids_tauxxu)%action = .true. ; infosend(ids_tauxxu)%name =
'COTAUXXU'
148 infosend(ids_tauyyu)%action = .true. ; infosend(ids_tauyyu)%name =
'COTAUYYU'
149 infosend(ids_tauzzu)%action = .true. ; infosend(ids_tauzzu)%name =
'COTAUZZU'
150 infosend(ids_tauxxv)%action = .true. ; infosend(ids_tauxxv)%name =
'COTAUXXV'
151 infosend(ids_tauyyv)%action = .true. ; infosend(ids_tauyyv)%name =
'COTAUYYV'
152 infosend(ids_tauzzv)%action = .true. ; infosend(ids_tauzzv)%name =
'COTAUZZV'
153 infosend(ids_windsp)%action = .true. ; infosend(ids_windsp)%name =
'COWINDSP'
154 infosend(ids_shfice)%action = .true. ; infosend(ids_shfice)%name =
'COSHFICE'
155 infosend(ids_nsfice)%action = .true. ; infosend(ids_nsfice)%name =
'CONSFICE'
156 infosend(ids_dflxdt)%action = .true. ; infosend(ids_dflxdt)%name =
'CODFLXDT'
157 infosend(ids_calvin)%action = .true. ; infosend(ids_calvin)%name =
'COCALVIN'
159 IF (version_ocean==
'nemo')
THEN
160 infosend(ids_shftot)%action = .true. ; infosend(ids_shftot)%name =
'COQSRMIX'
161 infosend(ids_nsftot)%action = .true. ; infosend(ids_nsftot)%name =
'COQNSMIX'
162 infosend(ids_totrai)%action = .true. ; infosend(ids_totrai)%name =
'COTOTRAI'
163 infosend(ids_totsno)%action = .true. ; infosend(ids_totsno)%name =
'COTOTSNO'
164 infosend(ids_toteva)%action = .true. ; infosend(ids_toteva)%name =
'COTOTEVA'
165 infosend(ids_icevap)%action = .true. ; infosend(ids_icevap)%name =
'COICEVAP'
166 infosend(ids_liqrun)%action = .true. ; infosend(ids_liqrun)%name =
'COLIQRUN'
167 infosend(ids_taumod)%action = .true. ; infosend(ids_taumod)%name =
'COTAUMOD'
168 IF (carbon_cycle_cpl)
THEN
169 infosend(ids_atmco2)%action = .true. ; infosend(ids_atmco2)%name =
'COATMCO2'
172 ELSE IF (version_ocean==
'opa8')
THEN
173 infosend(ids_shfoce)%action = .true. ; infosend(ids_shfoce)%name =
'COSHFOCE'
174 infosend(ids_nsfoce)%action = .true. ; infosend(ids_nsfoce)%name =
'CONSFOCE'
175 infosend(ids_icevap)%action = .true. ; infosend(ids_icevap)%name =
'COTFSICE'
176 infosend(ids_ocevap)%action = .true. ; infosend(ids_ocevap)%name =
'COTFSOCE'
177 infosend(ids_totrai)%action = .true. ; infosend(ids_totrai)%name =
'COTOLPSU'
178 infosend(ids_totsno)%action = .true. ; infosend(ids_totsno)%name =
'COTOSPSU'
179 infosend(ids_runcoa)%action = .true. ; infosend(ids_runcoa)%name =
'CORUNCOA'
180 infosend(ids_rivflu)%action = .true. ; infosend(ids_rivflu)%name =
'CORIVFLU'
185 inforecv(:)%action = .
false.
187 inforecv(idr_sisutw)%action = .true. ; inforecv(idr_sisutw)%name =
'SISUTESW'
188 inforecv(idr_icecov)%action = .true. ; inforecv(idr_icecov)%name =
'SIICECOV'
189 inforecv(idr_icealw)%action = .true. ; inforecv(idr_icealw)%name =
'SIICEALW'
190 inforecv(idr_icetem)%action = .true. ; inforecv(idr_icetem)%name =
'SIICTEMW'
192 IF (cpl_current )
THEN
193 inforecv(idr_curenx)%action = .true. ; inforecv(idr_curenx)%name =
'CURRENTX'
194 inforecv(idr_cureny)%action = .true. ; inforecv(idr_cureny)%name =
'CURRENTY'
195 inforecv(idr_curenz)%action = .true. ; inforecv(idr_curenz)%name =
'CURRENTZ'
198 IF (carbon_cycle_cpl )
THEN
199 inforecv(idr_oceco2)%action = .true. ; inforecv(idr_oceco2)%name =
'SICO2FLX'
205 IF (is_sequential)
THEN
206 CALL prism_init_comp_proto(comp_id, clmodnam, ierror)
208 IF (ierror .NE. prism_ok)
THEN
209 abort_message=
' Probleme init dans prism_init_comp '
212 WRITE(
lunout,*)
'inicma : init psmile ok '
216 CALL prism_get_localcomm_proto(il_commlocal, ierror)
221 ig_paral(2) = (jj_begin-1)*
iim+ii_begin-1
222 ig_paral(3) = (jj_end*
iim+ii_end) - (jj_begin*
iim+ii_begin) + 1
224 IF (mpi_rank==mpi_size-1) ig_paral(3)=ig_paral(3)+
iim-1
225 WRITE(
lunout,*) mpi_rank,
'ig_paral--->',ig_paral(2),ig_paral(3)
228 CALL prism_def_partition_proto(il_part_id, ig_paral, ierror)
230 IF (ierror .NE. prism_ok)
THEN
231 abort_message=
' Probleme dans prism_def_partition '
234 WRITE(
lunout,*)
'inicma : decomposition domaine psmile ok '
240 il_var_actual_shape(1) = 1
241 il_var_actual_shape(2) =
iim
242 il_var_actual_shape(3) = 1
243 il_var_actual_shape(4) = jjm+1
245 il_var_type = prism_real
252 IF (inforecv(jf)%action)
THEN
253 CALL prism_def_var_proto(inforecv(jf)%nid, inforecv(jf)%name, il_part_id, &
254 il_var_nodims, prism_in, il_var_actual_shape, il_var_type, &
256 IF (ierror .NE. prism_ok)
THEN
257 WRITE(
lunout,*)
'inicma : Problem with prism_def_var_proto for field : ',&
259 abort_message=
' Problem in call to prism_def_var_proto for fields to receive'
270 IF (infosend(jf)%action)
THEN
271 CALL prism_def_var_proto(infosend(jf)%nid, infosend(jf)%name, il_part_id, &
272 il_var_nodims, prism_out, il_var_actual_shape, il_var_type, &
274 IF (ierror .NE. prism_ok)
THEN
275 WRITE(
lunout,*)
'inicma : Problem with prism_def_var_proto for field : ',&
277 abort_message=
' Problem in call to prism_def_var_proto for fields to send'
286 CALL prism_enddef_proto(ierror)
287 IF (ierror .NE. prism_ok)
THEN
288 abort_message=
' Problem in call to prism_endef_proto'
291 WRITE(
lunout,*)
'inicma : endef psmile ok '
296 END SUBROUTINE inicma
302 SUBROUTINE fromcpl(ktime, tab_get)
308 include
"dimensions.h"
312 INTEGER,
INTENT(IN) :: ktime
316 REAL,
DIMENSION(iim, jj_nb,maxrecv),
INTENT(OUT) :: tab_get
321 INTEGER :: istart,iend
322 CHARACTER (len = 20) :: modname =
'fromcpl'
323 CHARACTER (len = 80) :: abort_message
324 REAL,
DIMENSION(iim*jj_nb) :: field
328 WRITE (
lunout,*)
'Fromcpl: Reading fields from CPL, ktime=',ktime
332 IF (is_south_pole)
THEN
333 iend=(jj_end-jj_begin)*
iim+
iim
335 iend=(jj_end-jj_begin)*
iim+ii_end
339 IF (inforecv(i)%action)
THEN
341 CALL prism_get_proto(inforecv(i)%nid, ktime, field(istart:iend), ierror)
342 tab_get(:,:,i) = reshape(field(:),(/
iim,
jj_nb/))
344 IF (ierror .NE. prism_ok .AND. ierror.NE.prism_recvd .AND. &
345 ierror.NE.prism_fromrest &
346 .AND. ierror.NE.prism_input .AND. ierror.NE.prism_recvout &
347 .AND. ierror.NE.prism_fromrestout)
THEN
348 WRITE (
lunout,*)
'Error with receiving filed : ', inforecv(i)%name, ktime
349 abort_message=
' Problem in prism_get_proto '
356 END SUBROUTINE fromcpl
362 SUBROUTINE intocpl(ktime, last, tab_put)
370 include
"dimensions.h"
374 INTEGER,
INTENT(IN) :: ktime
375 LOGICAL,
INTENT(IN) :: last
376 REAL,
DIMENSION(iim, jj_nb, maxsend),
INTENT(IN) :: tab_put
381 INTEGER :: istart,iend
382 INTEGER :: wstart,wend
384 REAL,
DIMENSION(iim*jj_nb) :: field
385 CHARACTER (len = 20),
PARAMETER :: modname =
'intocpl'
386 CHARACTER (len = 80) :: abort_message
392 WRITE(
lunout,*)
'Intocpl: sending fields to CPL, ktime= ', ktime
393 WRITE(
lunout,*)
'last = ', last
398 IF (is_south_pole)
THEN
399 iend=(jj_end-jj_begin)*
iim+
iim
401 iend=(jj_end-jj_begin)*
iim+ii_end
407 IF (is_north_pole) wstart=istart+
iim-1
408 IF (is_south_pole) wend=iend-
iim+1
411 IF (infosend(i)%action)
THEN
412 field = reshape(tab_put(:,:,i),(/
iim*
jj_nb/))
423 IF (infosend(i)%action)
THEN
424 field = reshape(tab_put(:,:,i),(/
iim*
jj_nb/))
425 CALL prism_put_proto(infosend(i)%nid, ktime, field(istart:iend), ierror)
427 IF (ierror .NE. prism_ok .AND. ierror.NE.prism_sent .AND. ierror.NE.prism_torest &
428 .AND. ierror.NE.prism_loctrans .AND. ierror.NE.prism_output .AND. &
429 ierror.NE.prism_sentout .AND. ierror.NE.prism_torestout)
THEN
430 WRITE (
lunout,*)
'Error with sending field :', infosend(i)%name, ktime
431 abort_message=
' Problem in prism_put_proto '
443 IF (is_sequential)
THEN
444 CALL prism_terminate_proto(ierror)
445 IF (ierror .NE. prism_ok)
THEN
446 abort_message=
' Problem in prism_terminate_proto '
453 END SUBROUTINE intocpl