Changeset 483 for codes/icosagcm/trunk/src/xios_mod.F90
- Timestamp:
- 09/26/16 14:09:01 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/xios_mod.F90
r482 r483 12 12 INTEGER,SAVE :: ncell_v 13 13 !$OMP THREADPRIVATE(ncell_v) 14 15 PRIVATE ncell_i,ncell_v 14 INTEGER,SAVE :: ncell_e 15 !$OMP THREADPRIVATE(ncell_e) 16 17 PRIVATE ncell_i,ncell_v,ncell_e 16 18 17 19 #ifdef CPP_USING_XIOS … … 44 46 USE mpi_mod 45 47 USE time_mod 46 USE metric, ONLY : vup,vdown 48 USE metric, ONLY : vup,vdown, cell_glo 47 49 IMPLICIT NONE 48 50 TYPE(xios_context) :: ctx_hdl … … 51 53 REAL(rstd) :: lev_valuep1(llm+1) 52 54 INTEGER :: ncell, ncell_tot, ncell_glo(0:mpi_size-1), displ 53 INTEGER :: ind, i,j,k,l 55 INTEGER :: ind, i,j,k,l,ij 54 56 REAL(rstd),ALLOCATABLE :: lon(:), lat(:), bounds_lon(:,:), bounds_lat(:,:) 57 INTEGER, ALLOCATABLE :: ind_glo(:) 55 58 TYPE(t_domain),POINTER :: d 56 59 … … 64 67 CALL xios_set_axis_attr("lev",n_glo=llm ,value=lev_value) ; 65 68 CALL xios_set_axis_attr("levp1",n_glo=llm+1 ,value=lev_valuep1) ; 69 CALL xios_set_axis_attr("nq",n_glo=nqtot) ; 66 70 67 71 ncell=0 … … 86 90 ncell_tot=sum(ncell_glo(:)) 87 91 88 ALLOCATE(lon(ncell), lat(ncell), bounds_lon(0:5,ncell), bounds_lat(0:5,ncell) )92 ALLOCATE(lon(ncell), lat(ncell), bounds_lon(0:5,ncell), bounds_lat(0:5,ncell), ind_glo(ncell)) 89 93 90 94 ncell=0 … … 104 108 bounds_lon(k,ncell)=bounds_lon(k,ncell)*180/Pi 105 109 ENDDO 110 ind_glo(ncell)=domain(ind)%assign_cell_glo(i,j)-1 106 111 ENDIF 107 112 ENDDO … … 109 114 ENDDO 110 115 111 112 116 CALL xios_set_domaingroup_attr("i",ni_glo=ncell_tot, ibegin=displ, ni=ncell) 113 CALL xios_set_domaingroup_attr("i", data_dim=1, type='unstructured' , nvertex=6 )117 CALL xios_set_domaingroup_attr("i", data_dim=1, type='unstructured' , nvertex=6, i_index=ind_glo) 114 118 CALL xios_set_domaingroup_attr("i",lonvalue_1d=lon, latvalue_1d=lat, bounds_lon_1d=bounds_lon, bounds_lat_1d=bounds_lat) 115 119 116 DEALLOCATE(lon, lat, bounds_lon, bounds_lat )120 DEALLOCATE(lon, lat, bounds_lon, bounds_lat,ind_glo) 117 121 122 123 124 ncell=0 125 DO ind=1,ndomain 126 d=>domain(ind) 127 128 DO j=d%jj_begin,d%jj_end 129 DO i=d%ii_begin,d%ii_end 130 DO k=0,5 131 IF (d%edge_assign_domain(k,i,j)==domloc_glo_ind(ind) .AND. d%edge_assign_i(k,i,j)==i .AND. d%edge_assign_j(k,i,j)==j & 132 .AND. d%edge_assign_pos(k,i,j)==k) THEN 133 ncell=ncell+1 134 ENDIF 135 ENDDO 136 ENDDO 137 ENDDO 138 ENDDO 139 ncell_e=ncell 140 141 CALL MPI_ALLGATHER(ncell_e,1,MPI_INTEGER,ncell_glo,1,MPI_INTEGER,comm_icosa,ierr) 142 displ=0 143 DO i=1,mpi_rank 144 displ=displ+ncell_glo(i-1) 145 ENDDO 146 ncell_tot=sum(ncell_glo(:)) 147 148 ALLOCATE(lon(ncell), lat(ncell), bounds_lon(0:1,ncell), bounds_lat(0:1,ncell),ind_glo(ncell)) 149 150 151 ncell=0 152 DO ind=1,ndomain 153 d=>domain(ind) 154 CALL swap_dimensions(ind) 155 CALL swap_geometry(ind) 156 157 DO j=d%jj_begin,d%jj_end 158 DO i=d%ii_begin,d%ii_end 159 DO k=0,5 160 IF (d%edge_assign_domain(k,i,j)==domloc_glo_ind(ind) .AND. d%edge_assign_i(k,i,j)==i .AND. d%edge_assign_j(k,i,j)==j & 161 .AND. d%edge_assign_pos(k,i,j)==k) THEN 162 ncell=ncell+1 163 ij=(j-1)*iim+i 164 165 lon(ncell)=lon_e(ij+u_pos(k+1))*180/Pi 166 lat(ncell)=lat_e(ij+u_pos(k+1))*180/Pi 167 168 CALL xyz2lonlat(d%vertex(:,MOD((k-1)+6,6),i,j),bounds_lon(0,ncell), bounds_lat(0,ncell)) 169 CALL xyz2lonlat(d%vertex(:,k,i,j),bounds_lon(1,ncell), bounds_lat(1,ncell)) 170 bounds_lon(:,ncell)=bounds_lon(:,ncell)*180/Pi 171 bounds_lat(:,ncell)=bounds_lat(:,ncell)*180/Pi 172 ind_glo(ncell)=cell_glo(d%assign_cell_glo(i,j))%edge(MOD(k+d%delta(i,j)+6,6))-1 173 ENDIF 174 ENDDO 175 ENDDO 176 ENDDO 177 ENDDO 178 CALL xios_set_domain_attr("u",ni_glo=ncell_tot, ibegin=displ, ni=ncell) 179 CALL xios_set_domain_attr("u", data_dim=1, type='unstructured' , nvertex=2, i_index=ind_glo) 180 CALL xios_set_domain_attr("u",lonvalue_1d=lon, latvalue_1d=lat, bounds_lon_1d=bounds_lon, bounds_lat_1d=bounds_lat) 181 182 DEALLOCATE(lon, lat, bounds_lon, bounds_lat,ind_glo) 183 184 118 185 ncell=0 119 186 DO ind=1,ndomain … … 219 286 IF (Field(1)%field_type==field_T) THEN 220 287 IF (field(1)%ndim==2) THEN 221 CALL xios_write_field_scalar(name,field,1) 288 CALL xios_write_field_scalar(name,field,1,1) 289 ELSE IF (field(1)%ndim==3) THEN 290 CALL xios_write_field_scalar(name,field,size(field(1)%rval3d,2),1) 291 ELSE IF (field(1)%ndim==4) THEN 292 ! DO iq=1,size(field(1)%rval4d,3) 293 ! WRITE(str_number,'(i10)') iq 294 ! CALL xios_write_field_scalar(name//TRIM(ADJUSTL(str_number)),field,size(field(1)%rval4d,2),iq) 295 CALL xios_write_field_scalar(name,field,size(field(1)%rval4d,2),size(field(1)%rval4d,3)) 296 ! ENDDO 297 ELSE 298 PRINT *, "xios_write_field : dimension > 4 are not supported for now" 299 ENDIF 300 301 ELSE IF (Field(1)%field_type==field_U) THEN 302 IF (field(1)%ndim==2) THEN 303 CALL xios_write_field_U(name,field,1,1) 222 304 ELSE IF (field(1)%ndim==3) THEN 223 CALL xios_write_field_ scalar(name,field,size(field(1)%rval3d,2))305 CALL xios_write_field_U(name,field,size(field(1)%rval3d,2),1) 224 306 ELSE IF (field(1)%ndim==4) THEN 225 DO iq=1,size(field(1)%rval4d,3) 226 WRITE(str_number,'(i10)') iq 227 CALL xios_write_field_scalar(name//TRIM(ADJUSTL(str_number)),field,size(field(1)%rval4d,2),iq) 228 ENDDO 307 CALL xios_write_field_U(name,field,size(field(1)%rval4d,2),size(field(1)%rval4d,3)) 229 308 ELSE 230 309 PRINT *, "xios_write_field : dimension > 4 are not supported for now" 231 310 ENDIF 311 232 312 ELSE IF (Field(1)%field_type==field_Z) THEN 233 313 IF (field(1)%ndim==2) THEN … … 262 342 IF (Field(1)%field_type==field_T) THEN 263 343 IF (field(1)%ndim==2) THEN 264 CALL xios_read_field_scalar(name,field,1 )344 CALL xios_read_field_scalar(name,field,1,1) 265 345 ELSE IF (field(1)%ndim==3) THEN 266 CALL xios_read_field_scalar(name,field,size(field(1)%rval3d,2) )346 CALL xios_read_field_scalar(name,field,size(field(1)%rval3d,2),1) 267 347 ELSE IF (field(1)%ndim==4) THEN 268 DO iq=1,size(field(1)%rval4d,3) 269 WRITE(str_number,'(i10)') iq 270 CALL xios_read_field_scalar(name//TRIM(ADJUSTL(str_number)),field,size(field(1)%rval4d,2),iq) 271 ENDDO 348 ! DO iq=1,size(field(1)%rval4d,3) 349 ! WRITE(str_number,'(i10)') iq 350 ! CALL xios_read_field_scalar(name//TRIM(ADJUSTL(str_number)),field,size(field(1)%rval4d,2),iq) 351 ! ENDDO 352 CALL xios_read_field_scalar(name,field,size(field(1)%rval4d,2),size(field(1)%rval4d,3)) 353 ELSE 354 PRINT *, "xios_write_field : dimension > 4 are not supported for now" 355 ENDIF 356 ELSE IF (Field(1)%field_type==field_U) THEN 357 IF (field(1)%ndim==2) THEN 358 CALL xios_read_field_u(name,field,1,1) 359 ELSE IF (field(1)%ndim==3) THEN 360 CALL xios_read_field_u(name,field,size(field(1)%rval3d,2),1) 361 ELSE IF (field(1)%ndim==4) THEN 362 CALL xios_read_field_u(name,field,size(field(1)%rval4d,2),size(field(1)%rval4d,3)) 272 363 ELSE 273 364 PRINT *, "xios_write_field : dimension > 4 are not supported for now" … … 294 385 295 386 296 SUBROUTINE xios_write_field_scalar(name,field,nlev, iq)387 SUBROUTINE xios_write_field_scalar(name,field,nlev,nq) 297 388 USE genmod 298 389 USE mpipara … … 308 399 TYPE(t_field), POINTER :: field(:) 309 400 INTEGER,INTENT(IN) :: nlev 310 INTEGER,INTENT(IN) ,OPTIONAL :: iq311 312 REAL(rstd) :: field_tmp(ncell_i,nlev )401 INTEGER,INTENT(IN) :: nq 402 403 REAL(rstd) :: field_tmp(ncell_i,nlev,nq) 313 404 TYPE(t_domain),POINTER :: d 314 405 INTEGER :: n,i,j,ij,ind … … 325 416 n=n+1 326 417 ij=d%iim*(j-1)+i 327 field_tmp(n,1 )=field(ind)%rval2d(ij)418 field_tmp(n,1,1)=field(ind)%rval2d(ij) 328 419 ENDIF 329 420 ENDDO … … 340 431 n=n+1 341 432 ij=d%iim*(j-1)+i 342 field_tmp(n,: )=field(ind)%rval3d(ij,:)433 field_tmp(n,:,1)=field(ind)%rval3d(ij,:) 343 434 ENDIF 344 435 ENDDO … … 355 446 n=n+1 356 447 ij=d%iim*(j-1)+i 357 field_tmp(n,: )=field(ind)%rval4d(ij,:,iq)448 field_tmp(n,:,:)=field(ind)%rval4d(ij,:,:) 358 449 ENDIF 359 450 ENDDO … … 367 458 368 459 369 SUBROUTINE xios_read_field_scalar(name,field,nlev, iq)460 SUBROUTINE xios_read_field_scalar(name,field,nlev,nq) 370 461 USE genmod 371 462 USE mpipara … … 381 472 TYPE(t_field), POINTER :: field(:) 382 473 INTEGER,INTENT(IN) :: nlev 383 INTEGER,INTENT(IN) ,OPTIONAL :: iq384 385 REAL(rstd) :: field_tmp(ncell_i,nlev )474 INTEGER,INTENT(IN) :: nq 475 476 REAL(rstd) :: field_tmp(ncell_i,nlev,nq) 386 477 TYPE(t_domain),POINTER :: d 387 478 INTEGER :: n,i,j,ij,ind … … 400 491 n=n+1 401 492 ij=d%iim*(j-1)+i 402 field(ind)%rval2d(ij)=field_tmp(n,1 )493 field(ind)%rval2d(ij)=field_tmp(n,1,1) 403 494 ENDIF 404 495 ENDDO … … 415 506 n=n+1 416 507 ij=d%iim*(j-1)+i 417 field(ind)%rval3d(ij,:)=field_tmp(n,: )508 field(ind)%rval3d(ij,:)=field_tmp(n,:,1) 418 509 ENDIF 419 510 ENDDO … … 430 521 n=n+1 431 522 ij=d%iim*(j-1)+i 432 field(ind)%rval4d(ij,:, iq)=field_tmp(n,:)523 field(ind)%rval4d(ij,:,:)=field_tmp(n,:,:) 433 524 ENDIF 434 525 ENDDO … … 438 529 439 530 END SUBROUTINE xios_read_field_scalar 531 532 SUBROUTINE xios_write_field_U(name,field,nlev,nq) 533 USE genmod 534 USE mpipara 535 USE xios 536 USE grid_param 537 USE domain_mod 538 USE dimensions 539 USE spherical_geom_mod 540 USE geometry 541 USE mpi_mod 542 IMPLICIT NONE 543 CHARACTER(LEN=*),INTENT(IN) :: name 544 TYPE(t_field), POINTER :: field(:) 545 INTEGER,INTENT(IN) :: nlev 546 INTEGER,INTENT(IN) :: nq 547 548 REAL(rstd) :: field_tmp(ncell_e,nlev,nq) 549 TYPE(t_domain),POINTER :: d 550 INTEGER :: n,i,j,k,ij,ind 551 552 IF (field(1)%ndim==2) THEN 553 n=0 554 DO ind=1,ndomain 555 d=>domain(ind) 556 CALL swap_dimensions(ind) 557 CALL swap_geometry(ind) 558 559 DO j=d%jj_begin,d%jj_end 560 DO i=d%ii_begin,d%ii_end 561 DO k=0,5 562 IF (d%edge_assign_domain(k,i,j)==domloc_glo_ind(ind) .AND. d%edge_assign_i(k,i,j)==i .AND. d%edge_assign_j(k,i,j)==j & 563 .AND. d%edge_assign_pos(k,i,j)==k) THEN 564 n=n+1 565 ij=iim*(j-1)+i 566 Field_tmp(n,1,1)=d%edge_assign_sign(k,i,j)*field(ind)%rval2d(ij+d%u_pos(k+1)) 567 ENDIF 568 ENDDO 569 ENDDO 570 ENDDO 571 ENDDO 572 573 ELSE IF (field(1)%ndim==3) THEN 574 575 n=0 576 DO ind=1,ndomain 577 d=>domain(ind) 578 CALL swap_dimensions(ind) 579 CALL swap_geometry(ind) 580 581 DO j=d%jj_begin,d%jj_end 582 DO i=d%ii_begin,d%ii_end 583 DO k=0,5 584 IF (d%edge_assign_domain(k,i,j)==domloc_glo_ind(ind) .AND. d%edge_assign_i(k,i,j)==i .AND. d%edge_assign_j(k,i,j)==j & 585 .AND. d%edge_assign_pos(k,i,j)==k) THEN 586 n=n+1 587 ij=iim*(j-1)+i 588 Field_tmp(n,:,1)=d%edge_assign_sign(k,i,j)*field(ind)%rval3d(ij+d%u_pos(k+1),:) 589 ENDIF 590 ENDDO 591 ENDDO 592 ENDDO 593 ENDDO 594 595 ELSE IF (field(1)%ndim==4) THEN 596 597 n=0 598 DO ind=1,ndomain 599 d=>domain(ind) 600 CALL swap_dimensions(ind) 601 CALL swap_geometry(ind) 602 603 DO j=d%jj_begin,d%jj_end 604 DO i=d%ii_begin,d%ii_end 605 DO k=0,5 606 IF (d%edge_assign_domain(k,i,j)==domloc_glo_ind(ind) .AND. d%edge_assign_i(k,i,j)==i .AND. d%edge_assign_j(k,i,j)==j & 607 .AND. d%edge_assign_pos(k,i,j)==k) THEN 608 n=n+1 609 ij=iim*(j-1)+i 610 Field_tmp(n,:,:)=d%edge_assign_sign(k,i,j)*field(ind)%rval4d(ij+d%u_pos(k+1),:,:) 611 ENDIF 612 ENDDO 613 ENDDO 614 ENDDO 615 ENDDO 616 617 ENDIF 618 619 CALL xios_send_field(name,field_tmp) 620 621 END SUBROUTINE xios_write_field_u 622 623 624 SUBROUTINE xios_read_field_u(name,field,nlev,nq) 625 USE genmod 626 USE mpipara 627 USE xios 628 USE grid_param 629 USE domain_mod 630 USE dimensions 631 USE spherical_geom_mod 632 USE geometry 633 USE mpi_mod 634 IMPLICIT NONE 635 CHARACTER(LEN=*),INTENT(IN) :: name 636 TYPE(t_field), POINTER :: field(:) 637 INTEGER,INTENT(IN) :: nlev 638 INTEGER,INTENT(IN) :: nq 639 640 REAL(rstd) :: field_tmp(ncell_e,nlev,nq) 641 TYPE(t_domain),POINTER :: d 642 INTEGER :: n,i,j,k,ij,ind 643 644 CALL xios_recv_field(name,field_tmp) 645 646 IF (field(1)%ndim==2) THEN 647 n=0 648 DO ind=1,ndomain 649 d=>domain(ind) 650 CALL swap_dimensions(ind) 651 CALL swap_geometry(ind) 652 653 DO j=d%jj_begin,d%jj_end 654 DO i=d%ii_begin,d%ii_end 655 DO k=0,5 656 IF (d%edge_assign_domain(k,i,j)==domloc_glo_ind(ind) .AND. d%edge_assign_i(k,i,j)==i .AND. d%edge_assign_j(k,i,j)==j & 657 .AND. d%edge_assign_pos(k,i,j)==k) THEN 658 n=n+1 659 ij=iim*(j-1)+i 660 field(ind)%rval2d(ij+d%u_pos(k+1))=Field_tmp(n,1,1)*d%edge_assign_sign(k,i,j) 661 ENDIF 662 ENDDO 663 ENDDO 664 ENDDO 665 ENDDO 666 667 ELSE IF (field(1)%ndim==3) THEN 668 669 n=0 670 DO ind=1,ndomain 671 d=>domain(ind) 672 CALL swap_dimensions(ind) 673 CALL swap_geometry(ind) 674 675 DO j=d%jj_begin,d%jj_end 676 DO i=d%ii_begin,d%ii_end 677 DO k=0,5 678 IF (d%edge_assign_domain(k,i,j)==domloc_glo_ind(ind) .AND. d%edge_assign_i(k,i,j)==i .AND. d%edge_assign_j(k,i,j)==j & 679 .AND. d%edge_assign_pos(k,i,j)==k) THEN 680 n=n+1 681 ij=iim*(j-1)+i 682 field(ind)%rval3d(ij+d%u_pos(k+1),:)=Field_tmp(n,:,1)*d%edge_assign_sign(k,i,j) 683 ENDIF 684 ENDDO 685 ENDDO 686 ENDDO 687 ENDDO 688 689 ELSE IF (field(1)%ndim==4) THEN 690 691 n=0 692 DO ind=1,ndomain 693 d=>domain(ind) 694 CALL swap_dimensions(ind) 695 CALL swap_geometry(ind) 696 697 DO j=d%jj_begin,d%jj_end 698 DO i=d%ii_begin,d%ii_end 699 DO k=0,5 700 IF (d%edge_assign_domain(k,i,j)==domloc_glo_ind(ind) .AND. d%edge_assign_i(k,i,j)==i .AND. d%edge_assign_j(k,i,j)==j & 701 .AND. d%edge_assign_pos(k,i,j)==k) THEN 702 n=n+1 703 ij=iim*(j-1)+i 704 field(ind)%rval4d(ij+d%u_pos(k+1),:,:)=Field_tmp(n,:,:)*d%edge_assign_sign(k,i,j) 705 ENDIF 706 ENDDO 707 ENDDO 708 ENDDO 709 ENDDO 710 711 ENDIF 712 713 714 END SUBROUTINE xios_read_field_u 715 440 716 441 717 … … 673 949 END INTERFACE xios_send_field 674 950 951 INTEGER,PARAMETER :: xios_timestep=1 675 952 676 953 CONTAINS … … 724 1001 END SUBROUTINE xios_set_context 725 1002 726 SUBROUTINE xios_set_fieldgroup_attr(name,enabled )1003 SUBROUTINE xios_set_fieldgroup_attr(name,enabled,freq_op) 727 1004 CHARACTER(LEN=*) :: name 728 1005 LOGICAL,OPTIONAL :: enabled 1006 INTEGER,OPTIONAL :: freq_op 729 1007 END SUBROUTINE xios_set_fieldgroup_attr 730 1008 … … 733 1011 LOGICAL,OPTIONAL :: enabled 734 1012 END SUBROUTINE xios_set_filegroup_attr 1013 1014 SUBROUTINE xios_set_file_attr(id,name,enabled, output_freq) 1015 CHARACTER(LEN=*) :: id 1016 CHARACTER(LEN=*),OPTIONAL :: name 1017 LOGICAL,OPTIONAL :: enabled 1018 INTEGER,OPTIONAL :: output_freq 1019 END SUBROUTINE xios_set_file_attr 735 1020 736 1021 SUBROUTINE xios_get_axis_attr(name,n_glo,value) … … 740 1025 END SUBROUTINE xios_get_axis_attr 741 1026 1027 SUBROUTINE xios_set_axis_attr(id,n_glo,value) 1028 CHARACTER(LEN=*) :: id 1029 INTEGER,OPTIONAL :: n_glo 1030 REAL,OPTIONAL :: value(:) 1031 END SUBROUTINE xios_set_axis_attr 1032 742 1033 #endif 743 1034
Note: See TracChangeset
for help on using the changeset viewer.