slave.F [SRC] [CPP] [JOB] [SCAN]
SOURCES / MAIN / SLAVE



   1 | include(dom.inc)
   2 | 
   3 |       SUBROUTINE slave
   4 | 
   5 | !       ================================================================!
   6 | !                                                                       !
   7 | !       slave.F       : Main control of the slave side of the code.     !
   8 | !                                                                       !
   9 | !       out           :                                                 !
  10 | !                                                                       !
  11 | !       author        : J. AMAYA (september 2007)                       !
  12 | !                                                                       !
  13 | !       ================================================================!
  14 | 
  15 | #ifdef USEPALM
  16 |         USE palm_prissma
  17 |         USE palmlib
  18 |         USE palm_user_param
  19 | #endif
  20 | 
  21 |         USE mod_inout
  22 |         USE mod_pmm
  23 |         USE mod_slave
  24 | 
  25 |         IMPLICIT NONE
  26 | 
  27 |         include 'pmm_constants.h'
  28 | 
  29 | !       LOCAL
  30 | #ifdef USEPALM
  31 |         DOM_INT          :: i_iter
  32 | #endif
  33 |         DOM_INT          :: ib_beg, ib_end, finprog, i, ierr, j, ibnd
  34 |         DOM_INT          :: i_bande, ngbands, ios
  35 |         DOM_INT          :: ICO,ICO2,IH2O
  36 |         LOGICAL          :: LICO,LICO2,LIH2O
  37 |         DOM_REAL         :: DWVNB_SI, WVNB_SI
  38 |         DOM_REAL         :: DWVNB, WVNB
  39 |         DOM_STR80        :: filefsck
  40 | 
  41 |         DOM_REAL, ALLOCATABLE, DIMENSION(:)    :: wkabs
  42 |         DOM_REAL, ALLOCATABLE, DIMENSION(:)    :: Lb, Lo, Lb_cell
  43 |         DOM_REAL, ALLOCATABLE, DIMENSION(:)    :: kscat_cell
  44 |         DOM_REAL, ALLOCATABLE, DIMENSION(:,:)  :: all_k_abs, kabs_cell
  45 |         DOM_REAL, ALLOCATABLE, DIMENSION(:,:)  :: data_cell
  46 | 
  47 |         DOM_REAL, ALLOCATABLE, DIMENSION(:,:)  :: Q_rtot, Q_ptot
  48 |         DOM_REAL, ALLOCATABLE, DIMENSION(:)    :: Gtot, Lbtot, Htot
  49 | 
  50 |         DOM_REAL, ALLOCATABLE, DIMENSION(:,:)  :: Q_rtot_n
  51 |         DOM_REAL, ALLOCATABLE, DIMENSION(:)    :: Gtot_n, Lbtot_n,Qw
  52 |         DOM_REAL, ALLOCATABLE, DIMENSION(:,:)  :: gb_Q_ptot
  53 | 
  54 | !       Speed-up debugging variables
  55 |         DOM_DBLE         :: cic_beg_time, cic_end_time
  56 |         DOM_DBLE         :: lum_beg_time, lum_end_time
  57 |         DOM_DBLE         :: snb_beg_time, snb_end_time
  58 |         DOM_DBLE         :: bint_beg_time, bint_end_time
  59 | 
  60 |         DOM_DBLE         :: cic_mean_time
  61 |         DOM_DBLE         :: lum_mean_time
  62 |         DOM_DBLE         :: snb_mean_time
  63 |         DOM_DBLE         :: bint_mean_time
  64 | 
  65 |         CHARACTER*80     :: mediumtype_bak
  66 | 
  67 |         IF(I_SCHEME.eq.-1) THEN
  68 |           mediumtype_bak = mediumtype
  69 |           mediumtype = 'DERIVE'
  70 |         ENDIF
  71 | 
  72 | 
  73 | !       --------------------------------------!
  74 | !       Receive vectors from master processor !
  75 | !       --------------------------------------!
  76 | 
  77 |         IF (pmm_rank.ne.PMM_HOST) THEN
  78 |           CALL slave_receive
  79 |         ENDIF
  80 | 
  81 | !       ------------------------!
  82 | !       Load runing parammeters !
  83 | !       ------------------------!
  84 | 
  85 |         CALL read_data_slave
  86 | 
  87 | #ifdef USEPALM
  88 | !       -------------------------!
  89 | !       PALM: Main coupling loop !
  90 | !       -------------------------!
  91 | 
  92 |         DO i_iter = 1, i_dom_iterations
  93 | 
  94 |         IF (pmm_rank.eq.PMM_HOST) THEN
  95 |           WRITE(*,*) " (PRISSMA) Coupling it:",i_iter,"/",              &
  96 |      &                  i_dom_iterations
  97 |         ENDIF
  98 | 
  99 | !       -------------------------------!
 100 | !       Receive fluid fields from PALM !
 101 | !       -------------------------------!
 102 | 
 103 | !       print*, " (PRISSMA ",pmm_rank,") Waiting for fluid fields"
 104 |         CALL interf_recvfields
 105 | !       print*, " (PRISSMA ",pmm_rank,") Fluid data received"
 106 | #endif
 107 | 
 108 | !       ---------------------------------------!
 109 | !       Allocate and Initialize result vectors !
 110 | !       ---------------------------------------!
 111 | 
 112 |         IF (.not.ALLOCATED(wkabs))  ALLOCATE(wkabs(is_nkabs))
 113 |         IF (.not.ALLOCATED(Lo))     ALLOCATE(Lo(is_nbfaces))
 114 | 
 115 |         IF (.not.ALLOCATED(Lbtot))  ALLOCATE(Lbtot(is_ncells))
 116 |         IF (.not.ALLOCATED(Gtot))   ALLOCATE(Gtot(is_ncells))
 117 |         IF (.not.ALLOCATED(Htot))   ALLOCATE(Htot(is_nbfaces))
 118 |         IF (.not.ALLOCATED(Q_rtot)) ALLOCATE(Q_rtot(3,is_ncells))
 119 |         IF (.not.ALLOCATED(Q_ptot)) ALLOCATE(Q_ptot(3,is_nprobes))
 120 | 
 121 |         Lbtot  = 0.
 122 |         Gtot   = 0.
 123 |         Htot   = 0.
 124 |         Q_rtot = 0.
 125 |         Q_ptot = 0.
 126 | 
 127 |         finprog = 0
 128 | 
 129 | !       ------------------------!
 130 | !       Initialize time counter !
 131 | !       ------------------------!
 132 | 
 133 | #ifdef USEPALM
 134 | !       CALL MPI_BARRIER(COMM_PARA ,ierr)
 135 | #else
 136 |         CALL MPI_BARRIER(COMM_PARA,ierr)
 137 | #endif
 138 | !       CALL cpu_time(sc_time)
 139 |         sc_time = MPI_WTIME()
 140 | 
 141 |         IF (pmm_rank.eq.PMM_HOST) THEN
 142 |           PRINT*
 143 |           IF(mediumtype.eq.'GRAY') THEN
 144 |             WRITE(*,*) "  ->> Spectral model : Gray gas"
 145 |           ELSEIF(mediumtype.eq.'WSGG') THEN
 146 |             WRITE(*,*) "  ->> Spectral model : WSGG"
 147 |           ELSE
 148 |             WRITE(*,*) "  ->> Spectral model : ",                       &
 149 |       &                trim(nb_base), "-", trim(mediumtype) 
 150 |           ENDIF
 151 |           PRINT*
 152 |         ENDIF
 153 | 
 154 | !       -----------------------!
 155 | !       Global spectral models !
 156 | !       -----------------------!
 157 |         IF (mediumtype.ne.'CK') THEN
 158 | 
 159 |           cic_mean_time  = 0
 160 |           lum_mean_time  = 0
 161 |           snb_mean_time  = 0
 162 | 
 163 |           CALL cpu_time(cic_beg_time)
 164 | 
 165 |           DWVNB_SI = 1.0
 166 |           ngbands  = is_nallbandes
 167 | 
 168 |           IF(.not.ALLOCATED(Lb)) ALLOCATE(Lb(is_nnodes))
 169 |           IF (.not.ALLOCATED(s_WSGG_W)) THEN
 170 |             ALLOCATE(s_WSGG_W(is_nkabs,is_nnodes))
 171 |           ENDIF
 172 | 
 173 |           CALL cpu_time(lum_beg_time)
 174 |           CALL EMISSIV(s_celldata, Lb, Lo, s_epsil, s_Tf,               &
 175 |      &                 is_nnodes, 1, is_nnodes,                         &
 176 |      &                 is_nbfaces, 1, is_nbfaces)
 177 |           CALL cpu_time(lum_end_time)
 178 |           lum_mean_time=lum_mean_time+(lum_end_time-lum_beg_time)
 179 | 
 180 |           IF(.not.ALLOCATED(all_k_abs))                                 &
 181 |      &       ALLOCATE(all_k_abs(is_nkabs,is_nnodes))
 182 | 
 183 | !         -------------------!
 184 | !         GRAY gas tratement !
 185 | !         -------------------!
 186 |           IF (mediumtype.eq.'GRAY') THEN
 187 | 
 188 |             wkabs          = 1.0
 189 |             s_WSGG_W       = 1.0
 190 |             all_k_abs(1,:) = s_kabs_gray(:)
 191 | 
 192 | !         ---------------------!
 193 | !         WSGG case treatement !
 194 | !         ---------------------!
 195 |           ELSEIF (mediumtype.eq.'WSGG') THEN
 196 | 
 197 |             wkabs    = 1.0
 198 | 
 199 |             CALL cpu_time(snb_beg_time)
 200 |             CALL WSGG_CASE(all_k_abs,s_WSGG_W,Lb,s_celldata,is_nnodes,  &
 201 |      &                   s_alpha,s_kwsgg,s_all_WVNB,s_all_DWVNB,        &
 202 |      &                   is_ngg,is_nallbandes, is_lbcd, is_lbcf)
 203 |             CALL cpu_time(snb_end_time)
 204 |             snb_mean_time=snb_mean_time+(snb_end_time-snb_beg_time)
 205 | 
 206 | !         --------------------!
 207 | !         FSK CASE TREATEMENT !
 208 | !         --------------------!
 209 | 
 210 |           ELSEIF (mediumtype.eq.'FSK') THEN
 211 | 
 212 |             s_WSGG_W       = 1.0
 213 | 
 214 |             CALL cpu_time(snb_beg_time)
 215 |             CALL FSK_CASE(all_k_abs, wkabs, s_celldata,is_nnodes,       &
 216 |      &                   s_all_WVNB, s_all_DWVNB, ngbands,              &
 217 |      &                   is_nallbandes, is_nkabs, is_lbcd, is_lbcf)
 218 |             CALL cpu_time(snb_end_time)
 219 |             snb_mean_time=snb_mean_time+(snb_end_time-snb_beg_time)
 220 | 
 221 | !         ---------------------!
 222 | !         FSCK CASE TREATEMENT !
 223 | !         ---------------------!
 224 | 
 225 |           ELSEIF (mediumtype.eq.'FSCK') THEN
 226 | 
 227 |             IF(.not.ALLOCATED(data_cell))                               &
 228 |      &         ALLOCATE(data_cell(8,is_ncells))
 229 |             CALL GATHER(s_celldata, data_cell, 8)
 230 | 
 231 | !           -------------------------------!
 232 | !           Choice of the reference state  !
 233 | !           0 -> from input_fsck.dat       ! 
 234 | !           1 -> average state             !
 235 | !           2 -> Maximal temperature       !
 236 | !           3 -> Maximal absorbing species !
 237 | !           -------------------------------!
 238 |     
 239 |             IF (i_refstate.eq.0) THEN
 240 |               IF (pmm_rank.eq.PMM_HOST) THEN
 241 |                 PRINT*, "Read reference state from file input_fsck.dat"
 242 |               ENDIF
 243 | 
 244 | #ifdef USEPALM
 245 |               filefsck = trim(rundomdir)//'input_fsck.dat'
 246 | #else
 247 |               filefsck = 'input_fsck.dat'
 248 | #endif
 249 |               OPEN(UNIT=1,FILE=filefsck,FORM='FORMATTED',STATUS='old',  &
 250 |      &             IOSTAT=ios) 
 251 | 
 252 |               DO i=1,8
 253 |                READ(1,*,IOSTAT=ios) s_dataref(i)
 254 |               ENDDO
 255 |               IF (ios.ne.0) THEN
 256 |                 PRINT*, "Error reading input_fsck.dat"
 257 |                 STOP
 258 |               ENDIF
 259 |                  
 260 |             ELSEIF (i_refstate.eq.1) THEN 
 261 |               CALL VOLAVERAGE(data_cell,s_dataref,8,1)
 262 |               DEALLOCATE(data_cell)
 263 |             ELSEIF (i_refstate.eq.2) THEN 
 264 |               i = MAXVAL(MAXLOC(s_celldata(1,:)))
 265 |               s_dataref(:) = s_celldata(:,i)       
 266 |             ELSEIF (i_refstate.eq.3) THEN
 267 |               i = MAXVAL(MAXLOC(s_celldata(3:5,:)))
 268 |               s_dataref(:) = s_celldata(:,i)       
 269 |             ENDIF
 270 | 
 271 |             IF (.not.ALLOCATED(s_WSGG_Wb)) THEN
 272 |               ALLOCATE(s_WSGG_Wb(is_nkabs,is_nbfaces))
 273 |             ENDIF
 274 | 
 275 |             CALL cpu_time(snb_beg_time)
 276 |             CALL FSCK_CASE(all_k_abs, wkabs, s_celldata,is_nnodes,      &
 277 |      &                     s_all_WVNB, s_all_DWVNB, ngbands,            &
 278 |      &                     is_nallbandes, is_nkabs, s_dataref, s_WSGG_W,&
 279 |      &                     is_lbcd, is_lbcf, s_WSGG_Wb, s_Tf,is_nbfaces)
 280 | 
 281 |             CALL cpu_time(snb_end_time)
 282 |             snb_mean_time=snb_mean_time+(snb_end_time-snb_beg_time)
 283 | 
 284 | !         ---------------------------------------!
 285 | !         Tabulated FSCK and FSK CASE TREATEMENT !
 286 | !         ---------------------------------------!
 287 | 
 288 |           ELSEIF ((mediumtype.eq.'TFSCK').or.(mediumtype.eq.'TFSK')) THEN
 289 | 
 290 |             CALL cpu_time(snb_beg_time)
 291 | 
 292 |             IF(mediumtype.eq.'TFSCK') THEN
 293 |  
 294 |               IF (.not.ALLOCATED(s_WSGG_Wb)) THEN
 295 |                 ALLOCATE(s_WSGG_Wb(is_nkabs,is_nbfaces))
 296 |               ENDIF
 297 | 
 298 |               CALL TFSCK_CASE(s_celldata,is_nnodes,                     &
 299 |      &                     s_all_WVNB, s_all_DWVNB, ngbands,            &
 300 |      &                     is_nallbandes, is_nkabs, s_dataref, s_WSGG_W,&
 301 |      &                     is_lbcd, is_lbcf, s_WSGG_Wb, s_Tf,is_nbfaces)
 302 | 
 303 |               ELSE
 304 | 
 305 |                 s_WSGG_W       = 1.0
 306 | 
 307 |               ENDIF
 308 | 
 309 |             CALL TFSK_CASE(s_celldata, all_k_abs, wkabs, s_tabkabs,     &
 310 |      &                    s_DYH, s_DYC, s_DYCO, is_nYH, is_nYC, is_nYCO,&
 311 |      &                    s_DT, is_nT, is_nkabs,                        &
 312 |      &                    is_nnodes, is_nallbandes, s_all_WVNB,         &
 313 |      &                    s_all_DWVNB,  is_lbcd, is_lbcf)
 314 | 
 315 |             CALL cpu_time(snb_end_time)
 316 |             snb_mean_time=snb_mean_time+(snb_end_time-snb_beg_time)
 317 | 
 318 |          ELSE
 319 |            finprog = 1
 320 |            IF(mediumtype(1:4).ne.'DERI') THEN
 321 |              WRITE(*,*) " Fatal error: unknown spectral type ",mediumtype
 322 |              STOP
 323 |            ENDIF
 324 |          ENDIF
 325 | 
 326 | !         ---------------!
 327 | !         Gather vectors !
 328 | !         ---------------!
 329 | 
 330 |           IF(.not.ALLOCATED(kabs_cell))                                 &
 331 |      &      ALLOCATE(kabs_cell(is_nkabs,is_ncells))
 332 |           IF(.not.ALLOCATED(kscat_cell)) ALLOCATE(kscat_cell(is_ncells))
 333 |           IF(.not.ALLOCATED(Lb_cell))    ALLOCATE(Lb_cell(is_ncells))
 334 | 
 335 |           CALL GATHER(all_k_abs, kabs_cell, is_nkabs)
 336 |           CALL GATHER(s_k_scat, kscat_cell, 1)
 337 |           CALL GATHER(Lb, Lb_cell, 1)
 338 | 
 339 | #ifndef USEPALM
 340 | !         IF (ALLOCATED(s_celldata)) DEALLOCATE(s_celldata)
 341 |           IF (ALLOCATED(all_k_abs))  DEALLOCATE(all_k_abs)
 342 |           IF (ALLOCATED(s_k_scat))   DEALLOCATE(s_k_scat)
 343 |           IF (ALLOCATED(Lb))         DEALLOCATE(Lb)
 344 | #endif
 345 | 
 346 | !         ----------------------------!
 347 | !         Integrate over the spectrum !
 348 | !         ----------------------------!
 349 | 
 350 |           bint_mean_time = 0
 351 |           CALL cpu_time(bint_beg_time)
 352 | 
 353 |           IF (finprog .ne. 1) THEN
 354 | 
 355 |             IF (pmm_rank.eq.PMM_HOST) THEN
 356 |             PRINT*, "  ->> Spectral integration over ",is_nkabs,"points"
 357 |             ENDIF
 358 | 
 359 |             CALL BAND_INTEG(wkabs, kabs_cell, kscat_cell, Lb_cell, Lo,  &
 360 |      &                     DWVNB_SI, Gtot, Lbtot, Htot, Q_rtot, Q_ptot)
 361 |           ENDIF
 362 | 
 363 |           CALL cpu_time(bint_end_time)
 364 |           bint_mean_time=bint_end_time-bint_beg_time
 365 | 
 366 |           CALL cpu_time(cic_end_time)
 367 |           cic_mean_time = cic_mean_time + (cic_end_time-cic_beg_time)
 368 | 
 369 | !       -------------------!
 370 | !       CK case treatement !
 371 | !       -------------------!
 372 | 
 373 |         ELSEIF (mediumtype.eq.'CK') THEN
 374 | 
 375 |           IF (pmm_rank.eq.PMM_HOST) THEN
 376 |             PRINT*, "  ->> Spectral integration over narrow bands: "
 377 |           ENDIF
 378 | 
 379 | !         ---------------!
 380 | !         Gather vectors !
 381 | !         ---------------!
 382 | 
 383 |           IF(.not.ALLOCATED(data_cell)) ALLOCATE(data_cell(8,is_ncells))
 384 |           IF(.not.ALLOCATED(Lb))        ALLOCATE(Lb(is_ncells))
 385 |           IF(.not.ALLOCATED(kscat_cell)) ALLOCATE(kscat_cell(is_ncells))
 386 |           IF(.not.ALLOCATED(all_k_abs))                                 &
 387 |      &       ALLOCATE(all_k_abs(is_nkabs,is_ncells))
 388 | 
 389 |           CALL GATHER(s_celldata, data_cell, 8)
 390 |           CALL GATHER(s_k_scat, kscat_cell, 1)
 391 | 
 392 | #ifndef USEPALM
 393 |           IF (ALLOCATED(s_celldata)) DEALLOCATE(s_celldata)
 394 |           IF (ALLOCATED(s_k_scat))   DEALLOCATE(s_k_scat)
 395 | #endif
 396 | 
 397 |           cic_mean_time  = 0
 398 |           lum_mean_time  = 0
 399 |           snb_mean_time  = 0
 400 |           bint_mean_time = 0
 401 | 
 402 | !         ----------------------------!
 403 | !         Calculate spectral interval !
 404 | !         ----------------------------!
 405 | 
 406 |           ib_beg = 1
 407 |           ib_end = is_nallbandes
 408 | !         IF (is_ndir.eq.1) THEN
 409 | !           ib_beg = is_cd
 410 | !           ib_end = is_cf
 411 | !         ENDIF 
 412 | 
 413 | !         --------------------!
 414 | !         Loop over all bands !
 415 | !         --------------------!
 416 | 
 417 | !         print*, " (",pmm_rank,") ibeg-iend:", ib_beg, ib_end
 418 |           DO i_bande = ib_beg, ib_end
 419 | 
 420 |             CALL cpu_time(cic_beg_time)
 421 | 
 422 | !           ------------------!
 423 | !           Set partitionning !
 424 | !           ------------------!
 425 | 
 426 |             is_dirbeg = 2
 427 |             IF (i_bande.ge.is_cd) is_dirbeg = 1
 428 | 
 429 |             is_dirend = is_ndir - 1
 430 |             IF (i_bande.le.is_cf) is_dirend = is_ndir
 431 | 
 432 | !           print*,  " (",pmm_rank,") d_beg, d_end:",is_dirbeg,is_dirend
 433 | 
 434 | !           -----------!
 435 | !           Initialize !
 436 | !           -----------!
 437 | 
 438 |             WVNB      = s_all_WVNB(i_bande)
 439 |             DWVNB     = s_all_DWVNB(i_bande)
 440 |             WVNB_SI   = 100.*WVNB
 441 |             DWVNB_SI  = 100.*DWVNB
 442 | 
 443 |             ngbands   = 1
 444 | 
 445 |             CALL cpu_time(lum_beg_time)
 446 |             CALL EMISSIV_SNB(data_cell, Lb, Lo, s_epsil,                &
 447 |      &                       s_Tf, WVNB_SI, is_ncells,                  &
 448 |      &                       1, is_ncells, is_nbfaces,1, is_nbfaces)
 449 |             CALL cpu_time(lum_end_time)
 450 |             lum_mean_time=lum_mean_time+(lum_end_time-lum_beg_time)
 451 | 
 452 |             CALL cpu_time(snb_beg_time)
 453 | 
 454 |             CALL CK_CASE(all_k_abs, wkabs, Lb, data_cell, is_ncells,    &
 455 |      &                    s_all_WVNB, s_all_DWVNB, ngbands, i_bande,    &
 456 |      &                    is_nallbandes, is_nkabs, is_cellb, is_cellf)
 457 | 
 458 |             CALL cpu_time(snb_end_time)
 459 |             snb_mean_time=snb_mean_time+(snb_end_time-snb_beg_time)
 460 | 
 461 | !           ------------------------!
 462 | !           Integrate over the band !
 463 | !           ------------------------!
 464 | 
 465 |             CALL cpu_time(bint_beg_time)
 466 | 
 467 |             IF (pmm_rank.eq.PMM_HOST) THEN
 468 |               PRINT*, "      Band: ", i_bande,"/", ib_end
 469 |             ENDIF
 470 | 
 471 |             CALL BAND_INTEG_SNB(wkabs, all_k_abs, kscat_cell, Lb, Lo,   &
 472 |      &                      DWVNB_SI, Gtot, Lbtot, Htot, Q_rtot, Q_ptot)
 473 |             CALL cpu_time(bint_end_time)
 474 |             bint_mean_time=bint_mean_time+(bint_end_time-bint_beg_time)
 475 | 
 476 |             CALL cpu_time(cic_end_time)
 477 |             cic_mean_time = cic_mean_time + (cic_end_time-cic_beg_time)
 478 | 
 479 | !           WRITE(69,*) i_bande, (cic_end_time-cic_beg_time)
 480 | 
 481 |           ENDDO
 482 | 
 483 | !         ---------------------------------------------------!
 484 | !         Stop computation time counter and reduce to master !
 485 | !         ---------------------------------------------------!
 486 | 
 487 |           ec_time = MPI_WTIME()
 488 | !         CALL cpu_time(ec_time)
 489 | 
 490 |           CALL MPI_REDUCE(ec_time-sc_time,c_time,1,MPI_DOUBLE_PRECISION,&
 491 |      &                    MPI_MAX, PMM_HOST, COMM_PARA  , ierr)
 492 | 
 493 |           cic_mean_time=cic_mean_time/(ib_end-ib_beg)
 494 |           bint_mean_time=bint_mean_time/(ib_end-ib_beg)
 495 |           snb_mean_time=snb_mean_time/(ib_end-ib_beg)
 496 |           lum_mean_time=lum_mean_time/(ib_end-ib_beg)
 497 | 
 498 |         ENDIF
 499 | 
 500 |         IF (pmm_rank.eq.PMM_HOST.and.finprog .ne. 1 ) THEN
 501 |         print*, "      Mean time per band      :",cic_mean_time,"sec."
 502 |         print*, "            + Planck luminance:",lum_mean_time,"sec."
 503 |         print*, "            + Kabs model      :",snb_mean_time,"sec."
 504 |         print*, "            + Band integration:",bint_mean_time,"sec."
 505 |         print*
 506 |         ENDIF
 507 | 
 508 | !       ---------------------------!
 509 | !       Send results to the master !
 510 | !       ---------------------------!
 511 | 
 512 |         IF(mediumtype(1:4).eq.'DERI') THEN
 513 |           finprog = 0
 514 |         ENDIF
 515 | 
 516 |         IF (finprog .ne. 1.) THEN
 517 | 
 518 |           IF (.not.ALLOCATED(Lbtot_n))   ALLOCATE(Lbtot_n(is_nnodes))
 519 |           IF (.not.ALLOCATED(Gtot_n))    ALLOCATE(Gtot_n(is_nnodes))
 520 |           IF (.not.ALLOCATED(Q_rtot_n))  ALLOCATE(Q_rtot_n(3,is_nnodes))
 521 |           IF (.not.ALLOCATED(Qw))        ALLOCATE(Qw(is_nbfaces))
 522 |           IF (.not.ALLOCATED(gb_Q_ptot))                                &
 523 |      &             ALLOCATE(gb_Q_ptot(3,is_nprobes))
 524 | 
 525 | !         ---------------------------------------------------------------------!
 526 | !         Optionnal : Calculate kappa derivative if mediumtype begin with DERI !
 527 | !         ---------------------------------------------------------------------!
 528 |           IF(mediumtype(1:4).eq.'DERI') THEN
 529 |             IF (pmm_rank.eq.PMM_HOST) THEN 
 530 |               PRINT*, " -> Radiative Transfer Equation is not solved"
 531 |               PRINT*, "    Calculate kappa derivative only: stored in G"
 532 |             ENDIF
 533 |             mediumtype = mediumtype_bak
 534 |             IF (pmm_rank.eq.PMM_HOST) PRINT*, " ->> Spectral model: ",  &
 535 |      &         mediumtype
 536 |             PRINT*
 537 | 
 538 |             IF(mediumtype.eq.'CK') THEN
 539 |               CALL DERI_KAPPA_SNB(6,0.01, 2, Gtot_n)
 540 |             ELSE
 541 |               CALL DERI_KAPPA(1,10.d0, 2, Gtot_n)
 542 |             ENDIF
 543 |           ELSE
 544 | !         ---------------------------------------------------------------------!
 545 | 
 546 | 
 547 |             IF (pmm_rank.eq.PMM_HOST) THEN
 548 |               WRITE(*,*) "  -> Postprocessing result vectors"
 549 |             ENDIF
 550 | 
 551 |             CALL POSTPROCESSING(Lbtot, Gtot, Q_rtot, Q_ptot,            &
 552 |      &         Lbtot_n, Gtot_n, Q_rtot_n, gb_Q_ptot, Qw  )
 553 |           ENDIF
 554 |          
 555 |           IF (pmm_rank.eq.PMM_HOST) THEN
 556 | 
 557 |             WRITE(*,*) " >> MASTER: Receiving result vectors"
 558 |             WRITE(*,*)
 559 | 
 560 |             CALL master_integrate(Gtot_n, Lbtot_n, Htot, Q_rtot_n,      &
 561 |      &                            gb_Q_ptot, Qw)
 562 |             CALL master_control(MASTER_OUTPROC)
 563 |           ENDIF
 564 | 
 565 |         ENDIF
 566 | 
 567 | #ifdef USEPALM
 568 | !       ---------------------------------------!
 569 | !       PALM: End of the coupling loop (ENDDO) !
 570 | !       ---------------------------------------!
 571 | !       print*, " DOM (",pmm_rank,") END OF COUPLING ITERATION"
 572 |         ENDDO
 573 | #endif
 574 | 
 575 |       END SUBROUTINE slave


slave.F could be called by:
Makefile [SOURCES] - 59 - 122 - 129 - 147 - 147
mpiprissma.F [SOURCES/MAIN] - 28