- Timestamp:
- 2014-10-31T12:45:41+01:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_3841_sbc/NEMOGCM/NEMO/OPA_SRC/SBC/cpl_oasis3.F90
r3294 r4827 34 34 USE in_out_manager ! I/O manager 35 35 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 36 USE fld_def 36 37 37 38 IMPLICIT NONE … … 46 47 47 48 LOGICAL, PUBLIC, PARAMETER :: lk_cpl = .TRUE. !: coupled flag 48 INTEGER, PUBLIC :: OASIS_Rcv = 1 !: return code if received field49 INTEGER, PUBLIC :: OASIS_idle = 0 !: return code if nothing done by oasis50 49 INTEGER :: ncomp_id ! id returned by prism_init_comp 51 50 INTEGER :: nerror ! return error code … … 62 61 END TYPE FLD_CPL 63 62 64 TYPE(FLD_CPL), DIMENSION(nmaxfld), PUBLIC :: s rcv, ssnd !: Coupling fields63 TYPE(FLD_CPL), DIMENSION(nmaxfld), PUBLIC :: ssnd !: Coupling fields 65 64 66 65 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: exfld ! Temporary buffer for receiving 66 INTEGER, PUBLIC :: localComm 67 67 68 68 !!---------------------------------------------------------------------- … … 106 106 107 107 108 SUBROUTINE cpl_prism_define( krcv, ksnd )108 SUBROUTINE cpl_prism_define( krcv, ksnd, sd ) 109 109 !!------------------------------------------------------------------- 110 110 !! *** ROUTINE cpl_prism_define *** … … 115 115 !! ** Method : OASIS3 MPI communication 116 116 !!-------------------------------------------------------------------- 117 INTEGER, INTENT(in) :: krcv, ksnd ! Number of received and sent coupling fields 117 INTEGER, INTENT(in) :: krcv, ksnd ! Number of received and sent coupling fields 118 TYPE(FLD), INTENT(in), DIMENSION(:) :: sd ! input field related variables 118 119 ! 119 120 INTEGER :: id_part … … 187 188 ! 188 189 DO ji = 1, krcv 189 IF ( s rcv(ji)%laction) THEN190 DO jc = 1, s rcv(ji)%nct191 IF ( s rcv(ji)%nct .gt. 1 ) THEN192 WRITE(zclname,'( a7, i1)') s rcv(ji)%clname,jc190 IF ( sd(ji)%loasis ) THEN 191 DO jc = 1, sd(ji)%nct 192 IF ( sd(ji)%nct .gt. 1 ) THEN 193 WRITE(zclname,'( a7, i1)') sd(ji)%clvar,jc 193 194 ELSE 194 zclname=s rcv(ji)%clname195 zclname=sd(ji)%clvar 195 196 ENDIF 196 197 WRITE(numout,*) "Define",ji,jc,zclname," for",PRISM_In 197 CALL prism_def_var_proto ( s rcv(ji)%nid(jc), zclname, id_part, (/ 2, 0/), &198 CALL prism_def_var_proto ( sd(ji)%nid(jc), zclname, id_part, (/ 2, 0/), & 198 199 & PRISM_In , ishape , PRISM_REAL, nerror) 199 200 IF ( nerror /= PRISM_Ok ) THEN 200 201 WRITE(numout,*) 'Failed to define transient ', ji, TRIM(zclname) 201 CALL prism_abort_proto ( s rcv(ji)%nid(jc), 'cpl_prism_define', 'Failure in prism_def_var')202 CALL prism_abort_proto ( sd(ji)%nid(jc), 'cpl_prism_define', 'Failure in prism_def_var') 202 203 ENDIF 203 204 END DO … … 256 257 257 258 258 SUBROUTINE cpl_prism_rcv( k id, kstep, pdata, kinfo)259 SUBROUTINE cpl_prism_rcv( kstep, sd ) 259 260 !!--------------------------------------------------------------------- 260 261 !! *** ROUTINE cpl_prism_rcv *** … … 263 264 !! like stresses and fluxes from the coupler or remote application. 264 265 !!---------------------------------------------------------------------- 265 INTEGER , INTENT(in ) :: kid ! variable index in the array266 266 INTEGER , INTENT(in ) :: kstep ! ocean time-step in seconds 267 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pdata ! IN to keep the value if nothing is done 268 INTEGER , INTENT( out) :: kinfo ! OASIS3 info argument 267 TYPE(FLD), INTENT(inout) :: sd ! input field related variables 269 268 !! 270 269 INTEGER :: jc ! local loop index … … 274 273 ! receive local data from OASIS3 on every process 275 274 ! 276 DO jc = 1, s rcv(kid)%nct277 278 CALL prism_get_proto ( s rcv(kid)%nid(jc), kstep, exfld, kinfo )275 DO jc = 1, sd%nct 276 277 CALL prism_get_proto ( sd%nid(jc), kstep, exfld, sd%ninfo ) 279 278 280 279 llaction = .false. 281 IF( kinfo == PRISM_Recvd .OR. kinfo == PRISM_FromRest .OR. &282 kinfo == PRISM_RecvOut .OR. kinfo == PRISM_FromRestOut ) llaction = .TRUE.283 284 IF ( ln_ctl ) WRITE(numout,*) "llaction, kinfo, kstep, ivarid: " , llaction, kinfo, kstep, srcv(kid)%nid(jc)280 IF( sd%ninfo == PRISM_Recvd .OR. sd%ninfo == PRISM_FromRest .OR. & 281 sd%ninfo == PRISM_RecvOut .OR. sd%ninfo == PRISM_FromRestOut ) llaction = .TRUE. 282 283 IF ( ln_ctl ) WRITE(numout,*) "llaction, info, kstep, ivarid: " , llaction, sd%ninfo, kstep, sd%nid(jc) 285 284 286 285 IF ( llaction ) THEN 287 286 288 kinfo = OASIS_Rcv289 pdata(nldi:nlei, nldj:nlej,jc) = exfld(:,:)287 sd%ninfo = OASIS_Rcv 288 sd%fnow(nldi:nlei, nldj:nlej,jc) = exfld(:,:) 290 289 291 290 !--- Fill the overlap areas and extra hallows (mpp) 292 291 !--- check periodicity conditions (all cases) 293 CALL lbc_lnk( pdata(:,:,jc), srcv(kid)%clgrid, srcv(kid)%nsgn )292 CALL lbc_lnk( sd%fnow(:,:,jc), sd%clvgrd, sd%nsgn ) 294 293 295 294 IF ( ln_ctl ) THEN 296 295 WRITE(numout,*) '****************' 297 WRITE(numout,*) 'prism_get_proto: Incoming ', s rcv(kid)%clname298 WRITE(numout,*) 'prism_get_proto: ivarid ' , s rcv(kid)%nid(jc)296 WRITE(numout,*) 'prism_get_proto: Incoming ', sd%clvar 297 WRITE(numout,*) 'prism_get_proto: ivarid ' , sd%nid(jc) 299 298 WRITE(numout,*) 'prism_get_proto: kstep', kstep 300 WRITE(numout,*) 'prism_get_proto: info ', kinfo301 WRITE(numout,*) ' - Minimum value is ', MINVAL( pdata(:,:,jc))302 WRITE(numout,*) ' - Maximum value is ', MAXVAL( pdata(:,:,jc))303 WRITE(numout,*) ' - Sum value is ', SUM( pdata(:,:,jc))299 WRITE(numout,*) 'prism_get_proto: info ', sd%ninfo 300 WRITE(numout,*) ' - Minimum value is ', MINVAL(sd%fnow(:,:,jc)) 301 WRITE(numout,*) ' - Maximum value is ', MAXVAL(sd%fnow(:,:,jc)) 302 WRITE(numout,*) ' - Sum value is ', SUM(sd%fnow(:,:,jc)) 304 303 WRITE(numout,*) '****************' 305 304 ENDIF 306 305 307 306 ELSE 308 kinfo = OASIS_idle307 sd%ninfo = OASIS_idle 309 308 ENDIF 310 309 … … 346 345 !!---------------------------------------------------------------------- 347 346 USE in_out_manager ! I/O manager 347 USE fld_def 348 348 LOGICAL, PUBLIC, PARAMETER :: lk_cpl = .FALSE. !: coupled flag 349 349 PUBLIC cpl_prism_init 350 PUBLIC cpl_prism_rcv 350 351 PUBLIC cpl_prism_finalize 351 352 CONTAINS … … 355 356 WRITE(numout,*) 'cpl_prism_init: Error you sould not be there...' 356 357 END SUBROUTINE cpl_prism_init 358 SUBROUTINE cpl_prism_rcv ( kstep, sd ) 359 INTEGER, INTENT(in ) :: kstep ! ocean time-step in seconds 360 TYPE(FLD), INTENT(inout) :: sd ! input field related variables 361 WRITE(numout,*) 'cpl_prism_rcv: Error you sould not be there...' 362 END SUBROUTINE cpl_prism_rcv 357 363 SUBROUTINE cpl_prism_finalize 358 364 WRITE(numout,*) 'cpl_prism_finalize: Error you sould not be there...'
Note: See TracChangeset
for help on using the changeset viewer.