Changeset 3411 for LMDZ6/branches/DYNAMICO-conv/libf/phylmd/iophy.F90
- Timestamp:
- Nov 5, 2018, 3:24:59 PM (6 years ago)
- Location:
- LMDZ6/branches/DYNAMICO-conv
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/DYNAMICO-conv
- Property svn:mergeinfo changed
/LMDZ6/trunk removed
- Property svn:mergeinfo changed
-
LMDZ6/branches/DYNAMICO-conv/libf/phylmd/iophy.F90
r3356 r3411 12 12 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: nptabij 13 13 INTEGER, SAVE :: itau_iophy 14 LOGICAL :: check_dim = .false.15 14 16 15 !$OMP THREADPRIVATE(itau_iophy) … … 35 34 ! ug Routine pour définir itau_iophy depuis phys_output_write_mod: 36 35 SUBROUTINE set_itau_iophy(ito) 37 IMPLICIT NONE38 INTEGER, INTENT(IN) :: ito39 itau_iophy = ito36 IMPLICIT NONE 37 INTEGER, INTENT(IN) :: ito 38 itau_iophy = ito 40 39 END SUBROUTINE 41 40 42 41 SUBROUTINE init_iophy_new(rlat,rlon) 43 44 USE dimphy, ONLY: klon 45 USE mod_phys_lmdz_para, ONLY: gather, bcast, & 46 jj_nb, jj_begin, jj_end, ii_begin, ii_end, & 47 mpi_size, mpi_rank, klon_mpi, & 42 USE dimphy, ONLY: klon 43 USE mod_phys_lmdz_para, ONLY: gather, bcast, & 44 jj_nb, jj_begin, jj_end, ii_begin, ii_end, & 45 mpi_size, mpi_rank, klon_mpi, & 48 46 is_sequential, is_south_pole_dyn 49 47 USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat, klon_glo, grid_type, unstructured 50 48 USE print_control_mod, ONLY: prt_level,lunout 51 49 #ifdef CPP_IOIPSL 52 50 USE ioipsl, ONLY: flio_dom_set 53 51 #endif 54 52 #ifdef CPP_XIOS 55 53 use wxios, ONLY: wxios_domain_param, wxios_domain_param_unstructured, wxios_context_init 56 USE wxios, ONLY: wxios_domain_param 57 #endif 58 IMPLICIT NONE 54 #endif 55 IMPLICIT NONE 59 56 REAL,DIMENSION(klon),INTENT(IN) :: rlon 60 57 REAL,DIMENSION(klon),INTENT(IN) :: rlat … … 175 172 END SUBROUTINE init_iophy_new 176 173 177 178 174 SUBROUTINE init_iophy(lat,lon) 179 180 USE mod_phys_lmdz_para, ONLY: jj_begin, jj_end, ii_begin, ii_end, jj_nb, & 181 mpi_size, mpi_rank 182 USE ioipsl, ONLY: flio_dom_set 183 USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat 184 185 IMPLICIT NONE 186 175 USE mod_phys_lmdz_para, ONLY: jj_begin, jj_end, ii_begin, ii_end, jj_nb, & 176 mpi_size, mpi_rank 177 USE ioipsl, ONLY: flio_dom_set 178 USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat 179 IMPLICIT NONE 187 180 REAL,DIMENSION(nbp_lon),INTENT(IN) :: lon 188 181 REAL,DIMENSION(nbp_lat),INTENT(IN) :: lat … … 232 225 #endif 233 226 IMPLICIT NONE 234 INCLUDE'clesphys.h'235 236 CHARACTER*(*), INTENT(IN) :: name237 INTEGER, INTENT(IN) :: itau0238 REAL,INTENT(IN) :: zjulian239 REAL,INTENT(IN) :: dtime240 CHARACTER(LEN=*), INTENT(IN) :: ffreq241 INTEGER,INTENT(IN) :: lev242 INTEGER,INTENT(OUT) :: nhori243 INTEGER,INTENT(OUT) :: nid_day227 include 'clesphys.h' 228 229 CHARACTER*(*), INTENT(IN) :: name 230 INTEGER, INTENT(IN) :: itau0 231 REAL,INTENT(IN) :: zjulian 232 REAL,INTENT(IN) :: dtime 233 CHARACTER(LEN=*), INTENT(IN) :: ffreq 234 INTEGER,INTENT(IN) :: lev 235 INTEGER,INTENT(OUT) :: nhori 236 INTEGER,INTENT(OUT) :: nid_day 244 237 245 238 !$OMP MASTER 246 IF (is_sequential) THEN247 CALLhistbeg(name,nbp_lon,io_lon, jj_nb,io_lat(jj_begin:jj_end), &248 1,nbp_lon,1,jj_nb,itau0, zjulian, dtime, nhori, nid_day)249 ELSE250 CALLhistbeg(name,nbp_lon,io_lon, jj_nb,io_lat(jj_begin:jj_end), &251 1,nbp_lon,1,jj_nb,itau0, zjulian, dtime, nhori, nid_day,phys_domain_id)252 ENDIF253 254 #ifdef CPP_XIOS 255 ! ug OMP en chantier...256 IF((.NOT. is_using_mpi) .OR. is_mpi_root) THEN257 ! ug Création du fichier258 IF (.not. ok_all_xml) THEN259 CALL wxios_add_file(name, ffreq, lev)260 ENDIF261 ENDIF239 IF (is_sequential) THEN 240 call histbeg(name,nbp_lon,io_lon, jj_nb,io_lat(jj_begin:jj_end), & 241 1,nbp_lon,1,jj_nb,itau0, zjulian, dtime, nhori, nid_day) 242 ELSE 243 call histbeg(name,nbp_lon,io_lon, jj_nb,io_lat(jj_begin:jj_end), & 244 1,nbp_lon,1,jj_nb,itau0, zjulian, dtime, nhori, nid_day,phys_domain_id) 245 ENDIF 246 247 #ifdef CPP_XIOS 248 ! ug OMP en chantier... 249 IF((.NOT. is_using_mpi) .OR. is_mpi_root) THEN 250 ! ug Création du fichier 251 IF (.not. ok_all_xml) THEN 252 CALL wxios_add_file(name, ffreq, lev) 253 ENDIF 254 ENDIF 262 255 #endif 263 256 !$OMP END MASTER … … 283 276 #ifndef CPP_IOIPSL_NO_OUTPUT 284 277 IF (is_sequential) THEN 285 CALLhistbeg(name,nbp_lon,io_lon, jj_nb,io_lat(jj_begin:jj_end), &278 call histbeg(name,nbp_lon,io_lon, jj_nb,io_lat(jj_begin:jj_end), & 286 279 1,nbp_lon,1,jj_nb,itau0, zjulian, dtime, nhori, nid_day) 287 280 ELSE 288 CALLhistbeg(name,nbp_lon,io_lon, jj_nb,io_lat(jj_begin:jj_end), &281 call histbeg(name,nbp_lon,io_lon, jj_nb,io_lat(jj_begin:jj_end), & 289 282 1,nbp_lon,1,jj_nb,itau0, zjulian, dtime, nhori, nid_day,phys_domain_id) 290 283 ENDIF … … 420 413 421 414 #ifndef CPP_IOIPSL_NO_OUTPUT 422 CALLhistbeg(nname,pim,plon,plon_bounds, &415 call histbeg(nname,pim,plon,plon_bounds, & 423 416 plat,plat_bounds, & 424 417 itau0, zjulian, dtime, nnhori, nnid_day) … … 461 454 ENDDO 462 455 #ifndef CPP_IOIPSL_NO_OUTPUT 463 CALLhistbeg(nname,npstn,npplon,npplon_bounds, &456 call histbeg(nname,npstn,npplon,npplon_bounds, & 464 457 npplat,npplat_bounds, & 465 458 itau0,zjulian,dtime,nnhori,nnid_day,phys_domain_id) … … 474 467 475 468 USE ioipsl, ONLY: histdef 476 USE mod_phys_lmdz_para, ONLY: jj_nb , is_master469 USE mod_phys_lmdz_para, ONLY: jj_nb 477 470 USE phys_output_var_mod, ONLY: type_ecri, zoutm, zdtime_moy, lev_files, & 478 471 nid_files, nhorim, swaero_diag, dryaod_diag, nfiles, & … … 480 473 USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat 481 474 USE aero_mod, ONLY : naero_tot, name_aero_tau 482 USE print_control_mod, ONLY: prt_level,lunout483 475 484 476 IMPLICIT NONE … … 501 493 zstophym=zdtime_moy 502 494 ENDIF 503 IF (check_dim .AND. is_master) WRITE(lunout,*)'histdef2d_old for ', nomvar 495 504 496 ! Appel a la lecture des noms et niveau d'ecriture des variables dans output.def 505 497 CALL conf_physoutputs(nomvar,flag_var) … … 551 543 USE ioipsl, ONLY: histdef 552 544 USE dimphy, ONLY: klev 553 USE mod_phys_lmdz_para, ONLY: jj_nb , is_master545 USE mod_phys_lmdz_para, ONLY: jj_nb 554 546 USE phys_output_var_mod, ONLY: type_ecri, zoutm, lev_files, nid_files, & 555 547 nhorim, zdtime_moy, levmin, levmax, & 556 548 nvertm, nfiles 557 549 USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat 558 USE print_control_mod, ONLY: prt_level,lunout559 550 IMPLICIT NONE 560 551 … … 572 563 ! Appel a la lecture des noms et niveau d'ecriture des variables dans output.def 573 564 CALL conf_physoutputs(nomvar,flag_var) 574 575 IF (check_dim .AND. is_master) WRITE(lunout,*)'histdef3d_old for ', nomvar576 565 577 566 IF (type_ecri(iff)=='inst(X)'.OR.type_ecri(iff)=='once') THEN … … 601 590 602 591 USE ioipsl, ONLY: histdef 603 USE mod_phys_lmdz_para, ONLY: jj_nb , is_master592 USE mod_phys_lmdz_para, ONLY: jj_nb 604 593 USE phys_output_var_mod, ONLY: ctrl_out, type_ecri_files, zoutm, zdtime_moy, & 605 594 clef_stations, phys_out_filenames, lev_files, & 606 nid_files, nhorim, swaero free_diag, swaero_diag, dryaod_diag,&595 nid_files, nhorim, swaero_diag, dryaod_diag,& 607 596 ok_4xCO2atm 608 597 USE print_control_mod, ONLY: prt_level,lunout … … 612 601 USE wxios, ONLY: wxios_add_field_to_file 613 602 #endif 614 USE print_control_mod, ONLY: prt_level,lunout615 603 IMPLICIT NONE 616 604 … … 623 611 REAL zstophym 624 612 CHARACTER(LEN=20) :: typeecrit 625 626 IF (check_dim .AND. is_master) WRITE(lunout,*)'histdef2d for ', var%name627 613 628 614 ! ug On récupère le type écrit de la structure: … … 686 672 var%name=='toplwai' .OR. var%name=='sollwai' ) ) ) THEN 687 673 IF ( var%flag(iff)<=lev_files(iff) ) swaero_diag=.TRUE. 688 ENDIF689 690 ! Set swaerofree_diag=true if at least one of the concerned variables are defined691 IF (var%name=='SWupTOAcleanclr' .OR. var%name=='SWupSFCcleanclr' .OR. var%name=='SWdnSFCcleanclr' .OR. &692 var%name=='LWupTOAcleanclr' .OR. var%name=='LWdnSFCcleanclr' ) THEN693 IF ( var%flag(iff)<=lev_files(iff) ) swaerofree_diag=.TRUE.694 674 ENDIF 695 675 … … 719 699 USE ioipsl, ONLY: histdef 720 700 USE dimphy, ONLY: klev 721 USE mod_phys_lmdz_para, ONLY: jj_nb , is_master701 USE mod_phys_lmdz_para, ONLY: jj_nb 722 702 USE phys_output_var_mod, ONLY: ctrl_out, type_ecri_files, zoutm, zdtime_moy, & 723 703 clef_stations, phys_out_filenames, lev_files, & 724 nid_files, nhorim, swaero free_diag, levmin, &704 nid_files, nhorim, swaero_diag, dryaod_diag, levmin, & 725 705 levmax, nvertm 726 706 USE print_control_mod, ONLY: prt_level,lunout … … 729 709 USE wxios, ONLY: wxios_add_field_to_file 730 710 #endif 731 USE print_control_mod, ONLY: prt_level,lunout732 711 IMPLICIT NONE 733 712 … … 739 718 REAL zstophym 740 719 CHARACTER(LEN=20) :: typeecrit 741 742 IF (check_dim .AND. is_master) WRITE(lunout,*)'histdef3d for ', var%name743 720 744 721 ! ug On récupère le type écrit de la structure: … … 756 733 ENDIF 757 734 735 758 736 ! Appel a la lecture des noms et niveau d'ecriture des variables dans output.def 759 737 CALL conf_physoutputs(var%name,var%flag) … … 796 774 #endif 797 775 ENDIF 798 799 ! Set swaerofree_diag=true if at least one of the concerned variables are defined800 IF (var%name=='rsucsaf' .OR. var%name=='rsdcsaf') THEN801 IF ( var%flag(iff)<=lev_files(iff) ) swaerofree_diag=.TRUE.802 ENDIF803 804 776 END SUBROUTINE histdef3d 805 777 … … 824 796 825 797 SUBROUTINE histwrite2d_phy_old(nid,lpoint,name,itau,field) 826 827 USE dimphy, ONLY: klon 828 USE mod_phys_lmdz_para, ONLY: Gather_omp, grid1Dto2D_mpi, & 829 is_sequential, klon_mpi_begin, klon_mpi_end, & 830 jj_nb, klon_mpi, is_master 831 USE ioipsl, ONLY: histwrite 832 USE print_control_mod, ONLY: prt_level,lunout 833 USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat 834 835 IMPLICIT NONE 798 USE dimphy, ONLY: klon 799 USE mod_phys_lmdz_para, ONLY: Gather_omp, grid1Dto2D_mpi, & 800 is_sequential, klon_mpi_begin, klon_mpi_end, & 801 jj_nb, klon_mpi 802 USE ioipsl, ONLY: histwrite 803 USE print_control_mod, ONLY: prt_level,lunout 804 USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat 805 IMPLICIT NONE 836 806 837 807 INTEGER,INTENT(IN) :: nid … … 848 818 849 819 IF (size(field)/=klon) CALL abort_physic('iophy::histwrite2d','Field first DIMENSION not equal to klon',1) 850 IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite2d_phy_old for ', name 851 820 852 821 CALL Gather_omp(field,buffer_omp) 853 822 !$OMP MASTER 854 823 CALL grid1Dto2D_mpi(buffer_omp,Field2d) 855 IF(.NOT.lpoint) THEN824 if(.NOT.lpoint) THEN 856 825 ALLOCATE(index2d(nbp_lon*jj_nb)) 857 826 ALLOCATE(fieldok(nbp_lon*jj_nb)) … … 891 860 892 861 SUBROUTINE histwrite3d_phy_old(nid,lpoint,name,itau,field) 893 894 USE dimphy, ONLY: klon 895 USE mod_phys_lmdz_para, ONLY: Gather_omp, grid1Dto2D_mpi, & 896 is_sequential, klon_mpi_begin, klon_mpi_end, & 897 jj_nb, klon_mpi, is_master 898 USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat 899 USE ioipsl, ONLY: histwrite 900 USE print_control_mod, ONLY: prt_level,lunout 901 902 IMPLICIT NONE 862 USE dimphy, ONLY: klon 863 USE mod_phys_lmdz_para, ONLY: Gather_omp, grid1Dto2D_mpi, & 864 is_sequential, klon_mpi_begin, klon_mpi_end, & 865 jj_nb, klon_mpi 866 USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat 867 USE ioipsl, ONLY: histwrite 868 USE print_control_mod, ONLY: prt_level,lunout 869 IMPLICIT NONE 903 870 904 871 INTEGER,INTENT(IN) :: nid … … 913 880 REAL,allocatable, DIMENSION(:,:) :: fieldok 914 881 915 IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite3d_phy_old for ', name916 882 917 883 IF (size(field,1)/=klon) CALL abort_physic('iophy::histwrite3d','Field first DIMENSION not equal to klon',1) … … 922 888 CALL grid1Dto2D_mpi(buffer_omp,field3d) 923 889 IF (.NOT.lpoint) THEN 924 925 926 927 928 929 890 ALLOCATE(index3d(nbp_lon*jj_nb*nlev)) 891 ALLOCATE(fieldok(nbp_lon*jj_nb,nlev)) 892 IF (prt_level >= 10) write(lunout,*)'Sending ',name,' to IOIPSL' 893 CALL histwrite(nid,name,itau,Field3d,nbp_lon*jj_nb*nlev,index3d) 894 IF (prt_level >= 10) write(lunout,*)'Finished sending ',name,' to IOIPSL' 895 ELSE 930 896 nlev=size(field,2) 931 897 ALLOCATE(index3d(npstn*nlev)) … … 933 899 934 900 IF (is_sequential) THEN 935 ! 936 ! 937 938 939 940 941 901 ! klon_mpi_begin=1 902 ! klon_mpi_end=klon 903 DO n=1, nlev 904 DO ip=1, npstn 905 fieldok(ip,n)=buffer_omp(nptabij(ip),n) 906 ENDDO 907 ENDDO 942 908 ELSE 943 944 945 946 947 948 949 950 909 DO n=1, nlev 910 DO ip=1, npstn 911 IF(nptabij(ip).GE.klon_mpi_begin.AND. & 912 nptabij(ip).LE.klon_mpi_end) THEN 913 fieldok(ip,n)=buffer_omp(nptabij(ip)-klon_mpi_begin+1,n) 914 ENDIF 915 ENDDO 916 ENDDO 951 917 ENDIF 952 918 IF (prt_level >= 10) write(lunout,*)'Sending ',name,' to IOIPSL' … … 954 920 IF (prt_level >= 10) write(lunout,*)'Finished sending ',name,' to IOIPSL' 955 921 ENDIF 956 957 922 DEALLOCATE(index3d) 923 DEALLOCATE(fieldok) 958 924 !$OMP END MASTER 959 925 960 926 END SUBROUTINE histwrite3d_phy_old 927 928 961 929 962 930 963 931 ! ug NOUVELLE VERSION DES WRITE AVEC LA BOUCLE DO RENTREE 964 932 SUBROUTINE histwrite2d_phy(var,field, STD_iff) 965 966 USE mod_phys_lmdz_omp_transfert, ONLY: bcast_omp967 933 USE dimphy, ONLY: klon, klev 968 934 USE mod_phys_lmdz_para, ONLY: gather_omp, grid1dto2d_mpi, & 969 935 jj_nb, klon_mpi, klon_mpi_begin, & 970 klon_mpi_end, is_sequential , is_master936 klon_mpi_end, is_sequential 971 937 USE ioipsl, ONLY: histwrite 972 938 USE phys_output_var_mod, ONLY: ctrl_out, clef_files, lev_files, & 973 939 nfiles, vars_defined, clef_stations, & 974 nid_files , swaerofree_diag, swaero_diag, dryaod_diag, ok_4xCO2atm940 nid_files 975 941 USE print_control_mod, ONLY: prt_level,lunout 976 942 USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat, grid_type, unstructured, regular_lonlat … … 981 947 982 948 IMPLICIT NONE 983 INCLUDE'clesphys.h'984 985 TYPE(ctrl_out), INTENT(IN) :: var986 REAL, DIMENSION(:), INTENT(IN) :: field987 INTEGER, INTENT(IN), OPTIONAL :: STD_iff ! ug RUSTINE POUR LES STD LEVS.....949 include 'clesphys.h' 950 951 TYPE(ctrl_out), INTENT(IN) :: var 952 REAL, DIMENSION(:), INTENT(IN) :: field 953 INTEGER, INTENT(IN), OPTIONAL :: STD_iff ! ug RUSTINE POUR LES STD LEVS..... 988 954 989 INTEGER :: iff, iff_beg, iff_end990 LOGICAL, SAVE :: firstx955 INTEGER :: iff, iff_beg, iff_end 956 LOGICAL, SAVE :: firstx 991 957 !$OMP THREADPRIVATE(firstx) 992 958 993 REAL,DIMENSION(klon_mpi) :: buffer_omp 994 INTEGER, allocatable, DIMENSION(:) :: index2d 995 REAL :: Field2d(nbp_lon,jj_nb) 996 997 INTEGER :: ip 998 REAL, ALLOCATABLE, DIMENSION(:) :: fieldok 999 1000 IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite2d_phy for ',trim(var%name) 1001 1002 IF (prt_level >= 10) THEN 1003 WRITE(lunout,*)'Begin histwrite2d_phy for ',trim(var%name) 1004 ENDIF 1005 959 REAL,DIMENSION(klon_mpi) :: buffer_omp 960 INTEGER, allocatable, DIMENSION(:) :: index2d 961 REAL :: Field2d(nbp_lon,jj_nb) 962 963 INTEGER :: ip 964 REAL, ALLOCATABLE, DIMENSION(:) :: fieldok 965 966 IF (prt_level >= 10) THEN 967 WRITE(lunout,*)'Begin histwrite2d_phy for ',trim(var%name) 968 ENDIF 1006 969 ! ug RUSTINE POUR LES STD LEVS..... 1007 IF (PRESENT(STD_iff)) THEN1008 iff_beg = STD_iff1009 iff_end = STD_iff1010 ELSE1011 iff_beg = 11012 iff_end = nfiles1013 ENDIF970 IF (PRESENT(STD_iff)) THEN 971 iff_beg = STD_iff 972 iff_end = STD_iff 973 ELSE 974 iff_beg = 1 975 iff_end = nfiles 976 ENDIF 1014 977 1015 978 ! On regarde si on est dans la phase de définition ou d'écriture: … … 1029 992 ENDIF 1030 993 !$OMP END MASTER 1031 !--broadcasting the flags that have been changed in histdef2d on OMP masters1032 CALL bcast_omp(swaero_diag)1033 CALL bcast_omp(swaerofree_diag)1034 CALL bcast_omp(dryaod_diag)1035 CALL bcast_omp(ok_4xCO2atm)1036 1037 994 ELSE 1038 995 … … 1148 1105 !$OMP END MASTER 1149 1106 ENDIF ! vars_defined 1150 1151 1107 IF (prt_level >= 10) WRITE(lunout,*)'End histwrite2d_phy ',trim(var%name) 1152 1153 1108 END SUBROUTINE histwrite2d_phy 1154 1109 … … 1156 1111 ! ug NOUVELLE VERSION DES WRITE AVEC LA BOUCLE DO RENTREE 1157 1112 SUBROUTINE histwrite3d_phy(var, field, STD_iff) 1158 1159 USE mod_phys_lmdz_omp_transfert, ONLY: bcast_omp1160 1113 USE dimphy, ONLY: klon, klev 1161 1114 USE mod_phys_lmdz_para, ONLY: gather_omp, grid1dto2d_mpi, & 1162 1115 jj_nb, klon_mpi, klon_mpi_begin, & 1163 klon_mpi_end, is_sequential , is_master1116 klon_mpi_end, is_sequential 1164 1117 USE ioipsl, ONLY: histwrite 1165 1118 USE phys_output_var_mod, ONLY: ctrl_out, clef_files, lev_files, & 1166 1119 nfiles, vars_defined, clef_stations, & 1167 nid_files , swaerofree_diag1120 nid_files 1168 1121 USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat, grid_type, regular_lonlat, unstructured 1169 1122 #ifdef CPP_XIOS … … 1173 1126 1174 1127 IMPLICIT NONE 1175 INCLUDE'clesphys.h'1176 1177 TYPE(ctrl_out), INTENT(IN) :: var1178 REAL, DIMENSION(:,:), INTENT(IN) :: field ! --> field(klon,:)1179 INTEGER, INTENT(IN), OPTIONAL :: STD_iff ! ug RUSTINE POUR LES STD LEVS.....1128 include 'clesphys.h' 1129 1130 TYPE(ctrl_out), INTENT(IN) :: var 1131 REAL, DIMENSION(:,:), INTENT(IN) :: field ! --> field(klon,:) 1132 INTEGER, INTENT(IN), OPTIONAL :: STD_iff ! ug RUSTINE POUR LES STD LEVS..... 1180 1133 1181 INTEGER :: iff, iff_beg, iff_end1182 LOGICAL, SAVE :: firstx1134 INTEGER :: iff, iff_beg, iff_end 1135 LOGICAL, SAVE :: firstx 1183 1136 !$OMP THREADPRIVATE(firstx) 1184 REAL,DIMENSION(klon_mpi,SIZE(field,2)) :: buffer_omp 1185 REAL :: Field3d(nbp_lon,jj_nb,SIZE(field,2)) 1186 INTEGER :: ip, n, nlev, nlevx 1187 INTEGER, ALLOCATABLE, DIMENSION(:) :: index3d 1188 REAL,ALLOCATABLE, DIMENSION(:,:) :: fieldok 1189 1190 IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite3d_phy for ', trim(var%name) 1137 REAL,DIMENSION(klon_mpi,SIZE(field,2)) :: buffer_omp 1138 REAL :: Field3d(nbp_lon,jj_nb,SIZE(field,2)) 1139 INTEGER :: ip, n, nlev, nlevx 1140 INTEGER, ALLOCATABLE, DIMENSION(:) :: index3d 1141 REAL,ALLOCATABLE, DIMENSION(:,:) :: fieldok 1191 1142 1192 1143 IF (prt_level >= 10) write(lunout,*)'Begin histrwrite3d ',var%name … … 1202 1153 1203 1154 ! On regarde si on est dans la phase de définition ou d'écriture: 1204 IF 1155 IF(.NOT.vars_defined) THEN 1205 1156 !Si phase de définition.... on définit 1206 1157 !$OMP MASTER … … 1211 1162 ENDDO 1212 1163 !$OMP END MASTER 1213 !--broadcasting the flag that have been changed in histdef3d on OMP masters1214 CALL bcast_omp(swaerofree_diag)1215 1164 ELSE 1216 1165 !Et sinon on.... écrit … … 1233 1182 IF (grid_type==regular_lonlat) CALL grid1Dto2D_mpi(buffer_omp,field3d) 1234 1183 1184 1235 1185 ! BOUCLE SUR LES FICHIERS 1236 firstx=.true.1237 1238 IF (ok_all_xml) THEN1186 firstx=.true. 1187 1188 IF (ok_all_xml) THEN 1239 1189 #ifdef CPP_XIOS 1240 1190 IF (prt_level >= 10) THEN … … 1250 1200 ELSE IF (grid_type==unstructured) THEN 1251 1201 CALL xios_send_field(var%name, buffer_omp(:,1:nlevx)) 1252 ENDIF1202 ENDIF 1253 1203 1254 1204 #else 1255 1205 CALL abort_physic ('iophy','cannot have ok_all_xml = .T. without CPP_XIOS defined' ,1) 1256 1206 #endif 1257 ELSE 1258 1259 DO iff=iff_beg, iff_end 1260 IF (var%flag(iff) <= lev_files(iff) .AND. clef_files(iff)) THEN 1207 ELSE 1208 1209 1210 DO iff=iff_beg, iff_end 1211 IF (var%flag(iff) <= lev_files(iff) .AND. clef_files(iff)) THEN 1261 1212 #ifdef CPP_XIOS 1262 1213 IF (firstx) THEN … … 1281 1232 ENDIF 1282 1233 #endif 1283 IF (.NOT.clef_stations(iff)) THEN1234 IF (.NOT.clef_stations(iff)) THEN 1284 1235 ALLOCATE(index3d(nbp_lon*jj_nb*nlev)) 1285 1236 ALLOCATE(fieldok(nbp_lon*jj_nb,nlev)) … … 1295 1246 !#endif 1296 1247 ! 1297 ELSE1248 ELSE 1298 1249 nlev=size(field,2) 1299 1250 ALLOCATE(index3d(npstn*nlev)) … … 1319 1270 CALL histwrite(nid_files(iff),var%name,itau_iophy,fieldok,npstn*nlev,index3d) 1320 1271 #endif 1321 ENDIF1322 DEALLOCATE(index3d)1323 DEALLOCATE(fieldok)1324 ENDIF1272 ENDIF 1273 DEALLOCATE(index3d) 1274 DEALLOCATE(fieldok) 1275 ENDIF 1325 1276 ENDDO 1326 ENDIF1277 ENDIF 1327 1278 !$OMP END MASTER 1328 1279 ENDIF ! vars_defined 1329 1330 1280 IF (prt_level >= 10) write(lunout,*)'End histrwrite3d ',var%name 1331 1332 1281 END SUBROUTINE histwrite3d_phy 1333 1282 … … 1336 1285 #ifdef CPP_XIOS 1337 1286 SUBROUTINE histwrite2d_xios(field_name,field) 1338 1339 1287 USE dimphy, ONLY: klon, klev 1340 1288 USE mod_phys_lmdz_para, ONLY: gather_omp, grid1Dto2D_mpi, & 1341 1289 is_sequential, klon_mpi_begin, klon_mpi_end, & 1342 jj_nb, klon_mpi , is_master1290 jj_nb, klon_mpi 1343 1291 USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat, grid_type, unstructured 1344 1292 USE xios, ONLY: xios_send_field … … 1347 1295 IMPLICIT NONE 1348 1296 1349 CHARACTER(LEN=*), INTENT(IN) :: field_name1350 REAL, DIMENSION(:), INTENT(IN) :: field1297 CHARACTER(LEN=*), INTENT(IN) :: field_name 1298 REAL, DIMENSION(:), INTENT(IN) :: field 1351 1299 1352 REAL,DIMENSION(klon_mpi) :: buffer_omp 1353 INTEGER, allocatable, DIMENSION(:) :: index2d 1354 REAL :: Field2d(nbp_lon,jj_nb) 1355 1356 INTEGER :: ip 1357 REAL, ALLOCATABLE, DIMENSION(:) :: fieldok 1358 1359 IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite2d_xios for ', field_name 1360 1361 IF (prt_level >= 10) WRITE(lunout,*)'Begin histrwrite2d_xios ',field_name 1362 1363 !Et sinon on.... écrit 1364 IF (SIZE(field)/=klon .AND. SIZE(field)/=klev) CALL abort_physic('iophy::histwrite2d_xios','Field first DIMENSION not equal to klon/klev',1) 1365 1366 IF (SIZE(field) == klev) then 1300 REAL,DIMENSION(klon_mpi) :: buffer_omp 1301 INTEGER, allocatable, DIMENSION(:) :: index2d 1302 REAL :: Field2d(nbp_lon,jj_nb) 1303 1304 INTEGER :: ip 1305 REAL, ALLOCATABLE, DIMENSION(:) :: fieldok 1306 1307 IF (prt_level >= 10) WRITE(lunout,*)'Begin histrwrite2d_xios ',field_name 1308 1309 !Et sinon on.... écrit 1310 IF (SIZE(field)/=klon .AND. SIZE(field)/=klev) CALL abort_physic('iophy::histwrite2d_xios','Field first DIMENSION not equal to klon/klev',1) 1311 1312 IF (SIZE(field) == klev) then 1367 1313 !$OMP MASTER 1368 1314 CALL xios_send_field(field_name,field) 1369 1315 !$OMP END MASTER 1370 ELSE1316 ELSE 1371 1317 CALL Gather_omp(field,buffer_omp) 1372 1318 !$OMP MASTER … … 1411 1357 ENDIF 1412 1358 !$OMP END MASTER 1413 ENDIF1359 ENDIF 1414 1360 1415 1361 IF (prt_level >= 10) WRITE(lunout,*)'End histrwrite2d_xios ',field_name … … 1419 1365 ! ug NOUVELLE VERSION DES WRITE AVEC LA BOUCLE DO RENTREE 1420 1366 SUBROUTINE histwrite3d_xios(field_name, field) 1421 1422 1367 USE dimphy, ONLY: klon, klev 1423 1368 USE mod_phys_lmdz_para, ONLY: gather_omp, grid1Dto2D_mpi, & 1424 1369 is_sequential, klon_mpi_begin, klon_mpi_end, & 1425 jj_nb, klon_mpi , is_master1370 jj_nb, klon_mpi 1426 1371 USE xios, ONLY: xios_send_field 1427 1372 USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat, grid_type, unstructured … … 1430 1375 IMPLICIT NONE 1431 1376 1432 CHARACTER(LEN=*), INTENT(IN) :: field_name 1433 REAL, DIMENSION(:,:), INTENT(IN) :: field ! --> field(klon,:) 1434 1435 REAL,DIMENSION(klon_mpi,SIZE(field,2)) :: buffer_omp 1436 REAL :: Field3d(nbp_lon,jj_nb,SIZE(field,2)) 1437 INTEGER :: ip, n, nlev 1438 INTEGER, ALLOCATABLE, DIMENSION(:) :: index3d 1439 REAL,ALLOCATABLE, DIMENSION(:,:) :: fieldok 1440 1441 IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite3d_xios for ', field_name 1377 CHARACTER(LEN=*), INTENT(IN) :: field_name 1378 REAL, DIMENSION(:,:), INTENT(IN) :: field ! --> field(klon,:) 1379 1380 REAL,DIMENSION(klon_mpi,SIZE(field,2)) :: buffer_omp 1381 REAL :: Field3d(nbp_lon,jj_nb,SIZE(field,2)) 1382 INTEGER :: ip, n, nlev 1383 INTEGER, ALLOCATABLE, DIMENSION(:) :: index3d 1384 REAL,ALLOCATABLE, DIMENSION(:,:) :: fieldok 1442 1385 1443 1386 IF (prt_level >= 10) write(lunout,*)'Begin histrwrite3d_xios ',field_name 1444 1387 1445 !Et on.... écrit1446 IF (SIZE(field,1)/=klon .AND. SIZE(field,1)/=klev) CALL abort_physic('iophy::histwrite3d_xios','Field first DIMENSION not equal to klon/klev',1)1447 1448 IF (SIZE(field,1) == klev) then1388 !Et on.... écrit 1389 IF (SIZE(field,1)/=klon .AND. SIZE(field,1)/=klev) CALL abort_physic('iophy::histwrite3d_xios','Field first DIMENSION not equal to klon/klev',1) 1390 1391 IF (SIZE(field,1) == klev) then 1449 1392 !$OMP MASTER 1450 1393 CALL xios_send_field(field_name,field) 1451 1394 !$OMP END MASTER 1452 ELSE1395 ELSE 1453 1396 nlev=SIZE(field,2) 1454 1397 … … 1498 1441 ENDIF 1499 1442 !$OMP END MASTER 1500 ENDIF1443 ENDIF 1501 1444 1502 1445 IF (prt_level >= 10) write(lunout,*)'End histrwrite3d_xios ',field_name 1503 1504 1446 END SUBROUTINE histwrite3d_xios 1505 1447 … … 1507 1449 SUBROUTINE histwrite0d_xios(field_name, field) 1508 1450 USE xios, ONLY: xios_send_field 1509 USE mod_phys_lmdz_para, ONLY: is_master1510 USE print_control_mod, ONLY: prt_level,lunout1511 1451 IMPLICIT NONE 1512 1452 1513 CHARACTER(LEN=*), INTENT(IN) :: field_name 1514 REAL, INTENT(IN) :: field ! --> scalar 1515 1516 IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite0d_xios for ', field_name 1453 CHARACTER(LEN=*), INTENT(IN) :: field_name 1454 REAL, INTENT(IN) :: field ! --> scalar 1517 1455 1518 1456 !$OMP MASTER 1519 CALL xios_send_field(field_name, field)1457 CALL xios_send_field(field_name, field) 1520 1458 !$OMP END MASTER 1521 1459 … … 1524 1462 1525 1463 #endif 1526 END MODULEiophy1464 end module iophy
Note: See TracChangeset
for help on using the changeset viewer.