Changeset 1779 for palm/trunk/SOURCE/pmc_server.f90
- Timestamp:
- Mar 3, 2016 8:01:28 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/pmc_server.f90
r1767 r1779 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! kind=dp replaced by wp, 23 ! error messages removed or changed to PALM style, dim_order removed 24 ! array management changed from linked list to sequential loop 23 25 ! 24 26 ! Former revisions: … … 52 54 USE kinds 53 55 USE PMC_general, ONLY: ClientDef, PMC_MAX_MODELL,PMC_sort, DA_NameDef, DA_Desclen, DA_Namelen, & 54 PMC_G_SetName, P MC_G_GetName, PeDef, ArrayDef56 PMC_G_SetName, PeDef, ArrayDef, PMC_MAX_ARRAY 55 57 USE PMC_handle_communicator, ONLY: m_model_comm,m_model_rank,m_model_npes, m_to_client_comm, & 56 58 PMC_Server_for_Client, m_world_rank … … 70 72 TYPE(ClientIndexDef),DIMENSION(PMC_MAX_MODELL) :: indClients 71 73 74 INTEGER :: next_array_in_list = 0 75 72 76 PUBLIC PMC_Server_for_Client 73 74 !-- TO_DO: what is the meaning of this? Could variables declared in this module75 !-- also have single precision?76 ! INTEGER, PARAMETER :: dp = wp77 78 ! INTERFACE section79 77 80 78 INTERFACE PMC_ServerInit … … 85 83 MODULE procedure PMC_S_Set_2D_index_list 86 84 END INTERFACE PMC_S_Set_2D_index_list 85 86 INTERFACE PMC_S_clear_next_array_list 87 MODULE procedure PMC_S_clear_next_array_list 88 END INTERFACE PMC_S_clear_next_array_list 87 89 88 90 INTERFACE PMC_S_GetNextArray … … 115 117 PUBLIC PMC_ServerInit, PMC_S_Set_2D_index_list, PMC_S_GetNextArray, PMC_S_Set_DataArray 116 118 PUBLIC PMC_S_setInd_and_AllocMem, PMC_S_FillBuffer, PMC_S_GetData_from_Buffer, PMC_S_Set_Active_data_array 119 PUBLIC PMC_S_clear_next_array_list 117 120 118 121 CONTAINS … … 145 148 146 149 ALLOCATE (Clients(ClientId)%PEs(Clients(ClientId)%inter_npes)) 147 148 do j=1,Clients(ClientId)%inter_npes ! Loop over all client PEs 149 NULLIFY(Clients(ClientId)%PEs(j)%Arrays) 150 ! 151 !-- Allocate for all client PEs an array of TYPE ArrayDef to store information of transfer array 152 do j=1,Clients(ClientId)%inter_npes 153 Allocate(Clients(ClientId)%PEs(j)%array_list(PMC_MAX_ARRAY)) 150 154 end do 151 155 … … 219 223 END SUBROUTINE PMC_S_Set_2D_index_list 220 224 221 logical function PMC_S_GetNextArray (ClientId, myName,Client_PeIndex) 225 SUBROUTINE PMC_S_clear_next_array_list 226 IMPLICIT none 227 228 next_array_in_list = 0 229 230 return 231 END SUBROUTINE PMC_S_clear_next_array_list 232 233 ! List handling is still required to get minimal interaction with pmc_interface 234 logical function PMC_S_GetNextArray (ClientId, myName) 235 INTEGER(iwp),INTENT(IN) :: ClientId 236 CHARACTER(len=*),INTENT(OUT) :: myName 237 238 !-- local variables 239 TYPE(PeDef),POINTER :: aPE 240 TYPE(ArrayDef),POINTER :: ar 241 242 next_array_in_list = next_array_in_list+1 243 244 !-- Array Names are the same on all client PE, so take first PE to get the name 245 aPE => Clients(ClientId)%PEs(1) 246 247 if(next_array_in_list > aPE%Nr_arrays) then 248 PMC_S_GetNextArray = .false. ! all arrays done 249 return 250 end if 251 252 ar => aPE%array_list(next_array_in_list) 253 myName = ar%name 254 255 PMC_S_GetNextArray = .true. ! Return true if legal array 256 return 257 END function PMC_S_GetNextArray 258 259 SUBROUTINE PMC_S_Set_DataArray_2d (ClientId, array, array_2 ) 260 261 IMPLICIT none 262 222 263 INTEGER,INTENT(IN) :: ClientId 223 CHARACTER(len=*),INTENT(OUT) :: myName 224 225 !-- local variables 226 INTEGER :: MyCoupleIndex 227 logical :: MyLast 228 CHARACTER(len=DA_Namelen) :: loName 229 INTEGER,INTENT(IN),optional :: Client_PeIndex 230 231 loName = ' ' 232 233 CALL PMC_G_GetName (clients(ClientId), MyCoupleIndex, loName, MyLast, Client_PeIndex) 234 235 myName = loName 236 237 PMC_S_GetNextArray = .NOT. MyLast ! Return true if valid array 238 239 return 240 END function PMC_S_GetNextArray 241 242 SUBROUTINE PMC_S_Set_DataArray_2d (ClientId, array, array_2 ) 243 IMPLICIT none 244 INTEGER,INTENT(IN) :: ClientId 245 !-- TO_DO: has array always to be of dp-kind, or can wp used here 246 !-- this effects all respective declarations in this file 247 REAL(kind=dp),INTENT(IN),DIMENSION(:,:) :: array 248 REAL(kind=dp),INTENT(IN),DIMENSION(:,:),OPTIONAL :: array_2 249 !-- local variables 264 REAL(wp), INTENT(IN), DIMENSION(:,:) :: array 265 REAL(wp), INTENT(IN), DIMENSION(:,:), OPTIONAL :: array_2 266 250 267 INTEGER :: NrDims 251 268 INTEGER,DIMENSION (4) :: dims 252 INTEGER :: dim_order253 269 TYPE(c_ptr) :: array_adr 254 270 TYPE(c_ptr) :: second_adr … … 259 275 dims(1) = size(array,1) 260 276 dims(2) = size(array,2) 261 dim_order = 2262 263 277 array_adr = c_loc(array) 264 278 265 279 IF ( PRESENT( array_2 ) ) THEN 266 280 second_adr = c_loc(array_2) 267 CALL PMC_S_SetArray (ClientId, NrDims, dims, dim_order,array_adr, second_adr = second_adr)281 CALL PMC_S_SetArray (ClientId, NrDims, dims, array_adr, second_adr = second_adr) 268 282 ELSE 269 CALL PMC_S_SetArray (ClientId, NrDims, dims, dim_order,array_adr)283 CALL PMC_S_SetArray (ClientId, NrDims, dims, array_adr) 270 284 ENDIF 271 285 … … 274 288 275 289 SUBROUTINE PMC_S_Set_DataArray_3d (ClientId, array, nz_cl, nz, array_2 ) 290 276 291 IMPLICIT none 292 277 293 INTEGER,INTENT(IN) :: ClientId 278 REAL( kind=dp),INTENT(IN),DIMENSION(:,:,:) ::array279 REAL( kind=dp),INTENT(IN),DIMENSION(:,:,:),OPTIONAL ::array_2294 REAL(wp), INTENT(IN), DIMENSION(:,:,:) :: array 295 REAL(wp), INTENT(IN), DIMENSION(:,:,:), OPTIONAL :: array_2 280 296 INTEGER,INTENT(IN) :: nz_cl 281 297 INTEGER,INTENT(IN) :: nz 282 !-- local variables 298 283 299 INTEGER :: NrDims 284 300 INTEGER,DIMENSION (4) :: dims 285 INTEGER :: dim_order286 301 TYPE(c_ptr) :: array_adr 287 302 TYPE(c_ptr) :: second_adr … … 294 309 dims(2) = size(array,2) 295 310 dims(3) = size(array,3) 296 dim_order = 33297 311 dims(4) = nz_cl+dims(1)-nz ! works for first dimension 1:nz and 0:nz+1 298 312 … … 304 318 IF ( PRESENT( array_2 ) ) THEN 305 319 second_adr = c_loc(array_2) 306 CALL PMC_S_SetArray (ClientId, NrDims, dims, dim_order,array_adr, second_adr = second_adr)320 CALL PMC_S_SetArray (ClientId, NrDims, dims, array_adr, second_adr = second_adr) 307 321 ELSE 308 CALL PMC_S_SetArray (ClientId, NrDims, dims, dim_order,array_adr)322 CALL PMC_S_SetArray (ClientId, NrDims, dims, array_adr) 309 323 ENDIF 310 324 … … 313 327 314 328 SUBROUTINE PMC_S_setInd_and_AllocMem (ClientId) 329 330 USE control_parameters, & 331 ONLY: message_string 332 315 333 IMPLICIT none 334 316 335 INTEGER,INTENT(IN) :: ClientId 317 336 318 INTEGER :: i, istat, ierr 337 INTEGER :: i, istat, ierr, j 319 338 INTEGER :: arlen, myIndex, tag 320 339 INTEGER :: rCount ! count MPI requests … … 337 356 aPE => Clients(ClientId)%PEs(i) 338 357 tag = 200 339 do while (PMC_S_GetNextArray ( ClientId, myName,i))340 ar => aPE% Arrays341 if(ar% dim_order== 2) then358 do j=1,aPE%Nr_arrays 359 ar => aPE%array_list(j) 360 if(ar%NrDims == 2) then 342 361 arlen = aPE%NrEle; ! 2D 343 else if(ar% dim_order == 33) then362 else if(ar%NrDims == 3) then 344 363 arlen = aPE%NrEle * ar%A_dim(4); ! PALM 3D 345 364 else … … 382 401 do i=1,Clients(ClientId)%inter_npes 383 402 aPE => Clients(ClientId)%PEs(i) 384 do while (PMC_S_GetNextArray ( ClientId, myName,i))385 ar => aPE% Arrays403 do j=1,aPE%Nr_arrays 404 ar => aPE%array_list(j) 386 405 !-- TO_DO: Adressrechnung ueberlegen? 387 406 ar%SendBuf = c_loc(base_array(ar%BufIndex)) !kk Adressrechnung ueberlegen 388 407 if(ar%BufIndex+ar%BufSize > bufsize) then 389 408 !-- TO_DO: can this error really happen, and what can be the reason? 390 write(0,'(a,i4,4i7,1x,a)') 'Buffer too small ',i,ar%BufIndex,ar%BufSize,ar%BufIndex+ar%BufSize,bufsize,trim( myName)409 write(0,'(a,i4,4i7,1x,a)') 'Buffer too small ',i,ar%BufIndex,ar%BufSize,ar%BufIndex+ar%BufSize,bufsize,trim(ar%name) 391 410 CALL MPI_Abort (MPI_COMM_WORLD, istat, ierr) 392 411 end if … … 399 418 SUBROUTINE PMC_S_FillBuffer (ClientId, WaitTime) 400 419 IMPLICIT none 401 INTEGER,INTENT(IN) :: ClientId 402 REAL(kind=dp),INTENT(OUT),optional :: WaitTime 403 404 !-- local variables 405 INTEGER :: ip,ij,istat,ierr 406 INTEGER :: myIndex 407 REAL(kind=dp) :: t1,t2 408 TYPE(PeDef),POINTER :: aPE 409 TYPE(ArrayDef),POINTER :: ar 410 CHARACTER(len=DA_Namelen) :: myName 411 INTEGER,DIMENSION(1) :: buf_shape 412 REAL(kind=wp),POINTER,DIMENSION(:) :: buf 413 REAL(kind=wp),POINTER,DIMENSION(:,:) :: data_2d 414 REAL(kind=wp),POINTER,DIMENSION(:,:,:) :: data_3d 420 INTEGER,INTENT(IN) :: ClientId 421 REAL(wp), INTENT(OUT), OPTIONAL :: WaitTime 422 423 INTEGER :: ip,ij,istat,ierr,j 424 INTEGER :: myIndex 425 REAL(wp) :: t1,t2 426 TYPE(PeDef),POINTER :: aPE 427 TYPE(ArrayDef),POINTER :: ar 428 CHARACTER(len=DA_Namelen) :: myName 429 INTEGER,DIMENSION(1) :: buf_shape 430 REAL(wp), POINTER, DIMENSION(:) :: buf 431 REAL(wp), POINTER, DIMENSION(:,:) :: data_2d 432 REAL(wp), POINTER, DIMENSION(:,:,:) :: data_3d 415 433 416 434 t1 = PMC_Time() … … 421 439 do ip=1,Clients(ClientId)%inter_npes 422 440 aPE => Clients(ClientId)%PEs(ip) 423 do while (PMC_S_GetNextArray ( ClientId, myName,ip))424 ar => aPE% Arrays441 do j=1,aPE%Nr_arrays 442 ar => aPE%array_list(j) 425 443 myIndex=1 426 if(ar% dim_order== 2) then444 if(ar%NrDims == 2) then 427 445 buf_shape(1) = aPE%NrEle 428 446 CALL c_f_pointer(ar%SendBuf, buf, buf_shape) … … 432 450 myIndex = myIndex+1 433 451 end do 434 else if(ar% dim_order == 33) then452 else if(ar%NrDims == 3) then 435 453 buf_shape(1) = aPE%NrEle*ar%A_dim(4) 436 454 CALL c_f_pointer(ar%SendBuf, buf, buf_shape) … … 440 458 myIndex = myIndex+ar%A_dim(4) 441 459 end do 442 else443 !-- TO_DO: can this error really happen, and what can be the reason?444 write(0,*) "Illegal Order of Dimension ",ar%dim_order445 CALL MPI_Abort (MPI_COMM_WORLD, istat, ierr);446 447 460 end if 448 461 end do 449 462 end do 450 463 451 CALL MPI_Barrier(Clients(ClientId)%intra_comm, ierr) 464 CALL MPI_Barrier(Clients(ClientId)%intra_comm, ierr) ! buffer is full 452 465 453 466 return … … 455 468 456 469 SUBROUTINE PMC_S_GetData_from_Buffer (ClientId, WaitTime) 470 457 471 IMPLICIT none 458 INTEGER,INTENT(IN) :: ClientId 459 REAL(kind=dp),INTENT(OUT),optional :: WaitTime 472 473 INTEGER,INTENT(IN) :: ClientId 474 REAL(wp), INTENT(OUT), OPTIONAL :: WaitTime 460 475 461 476 !-- local variables 462 INTEGER :: ip,ij,istat,ierr463 INTEGER ::myIndex464 REAL( kind=dp) ::t1,t2465 TYPE(PeDef),POINTER ::aPE466 TYPE(ArrayDef),POINTER ::ar467 CHARACTER(len=DA_Namelen) ::myName468 INTEGER,DIMENSION(1) ::buf_shape469 REAL( kind=wp),POINTER,DIMENSION(:) ::buf470 REAL( kind=wp),POINTER,DIMENSION(:,:) ::data_2d471 REAL( kind=wp),POINTER,DIMENSION(:,:,:) ::data_3d477 INTEGER :: ip,ij,istat,ierr,j 478 INTEGER :: myIndex 479 REAL(wp) :: t1,t2 480 TYPE(PeDef),POINTER :: aPE 481 TYPE(ArrayDef),POINTER :: ar 482 CHARACTER(len=DA_Namelen) :: myName 483 INTEGER,DIMENSION(1) :: buf_shape 484 REAL(wp), POINTER, DIMENSION(:) :: buf 485 REAL(wp), POINTER, DIMENSION(:,:) :: data_2d 486 REAL(wp), POINTER, DIMENSION(:,:,:) :: data_3d 472 487 473 488 t1 = PMC_Time() … … 478 493 do ip=1,Clients(ClientId)%inter_npes 479 494 aPE => Clients(ClientId)%PEs(ip) 480 do while (PMC_S_GetNextArray ( ClientId, myName,ip))481 ar => aPE% Arrays495 do j=1,aPE%Nr_arrays 496 ar => aPE%array_list(j) 482 497 myIndex=1 483 if(ar% dim_order== 2) then498 if(ar%NrDims == 2) then 484 499 buf_shape(1) = aPE%NrEle 485 500 CALL c_f_pointer(ar%SendBuf, buf, buf_shape) … … 489 504 myIndex = myIndex+1 490 505 end do 491 else if(ar% dim_order == 33) then506 else if(ar%NrDims == 3) then 492 507 buf_shape(1) = aPE%NrEle*ar%A_dim(4) 493 508 CALL c_f_pointer(ar%SendBuf, buf, buf_shape) … … 497 512 myIndex = myIndex+ar%A_dim(4) 498 513 end do 499 else500 !-- TO_DO: can this error really happen, and what can be the reason?501 write(0,*) "Illegal Order of Dimension ",ar%dim_order502 CALL MPI_Abort (MPI_COMM_WORLD, istat, ierr);503 504 514 end if 505 515 end do … … 535 545 END SUBROUTINE Get_DA_names_from_client 536 546 537 SUBROUTINE PMC_S_SetArray (ClientId, NrDims, dims, dim_order,array_adr, second_adr)547 SUBROUTINE PMC_S_SetArray (ClientId, NrDims, dims, array_adr, second_adr) 538 548 IMPLICIT none 539 549 … … 541 551 INTEGER,INTENT(IN) :: NrDims 542 552 INTEGER,INTENT(IN),DIMENSION(:) :: dims 543 INTEGER,INTENT(IN) :: dim_order544 553 TYPE(c_ptr),INTENT(IN) :: array_adr 545 554 TYPE(c_ptr),INTENT(IN),OPTIONAL :: second_adr … … 554 563 do i=1,Clients(ClientId)%inter_npes 555 564 aPE => Clients(ClientId)%PEs(i) 556 ar => aPE% Arrays565 ar => aPE%array_list(next_array_in_list) 557 566 ar%NrDims = NrDims 558 567 ar%A_dim = dims 559 ar%dim_order = dim_order560 568 ar%data = array_adr 561 569 if(present(second_adr)) then … … 579 587 580 588 !-- local variables 581 INTEGER :: i, ip 589 INTEGER :: i, ip, j 582 590 TYPE(PeDef),POINTER :: aPE 583 591 TYPE(ArrayDef),POINTER :: ar … … 586 594 do ip=1,Clients(ClientId)%inter_npes 587 595 aPE => Clients(ClientId)%PEs(ip) 588 do while (PMC_S_GetNextArray ( ClientId, myName,ip))589 ar => aPE% Arrays596 do j=1,aPE%Nr_arrays 597 ar => aPE%array_list(j) 590 598 if(iactive == 1 .OR. iactive == 2) then 591 599 ar%data = ar%po_data(iactive)
Note: See TracChangeset
for help on using the changeset viewer.